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));
1873bf3b463Smrg    if (pStart != NULL)
1883bf3b463Smrg    {
1893bf3b463Smrg        STORE_STRING (pBuf, reason);
1903bf3b463Smrg        IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
1913bf3b463Smrg    }
192266e564dSmrg    IceFlush (iceConn);
193266e564dSmrg}
194266e564dSmrg
195266e564dSmrg
196266e564dSmrgvoid
197c5629e66Smrg_IceErrorAuthenticationRejected (
198c5629e66Smrg	IceConn	iceConn,
199c5629e66Smrg	int	offendingMinor,
2009ef0b394Smrg	const char	*reason
201c5629e66Smrg)
202266e564dSmrg{
203266e564dSmrg    char *pBuf, *pStart;
204266e564dSmrg    int bytes;
205266e564dSmrg
206266e564dSmrg    if (!reason)
207266e564dSmrg	reason = "";
208266e564dSmrg    bytes = STRING_BYTES (reason);
209266e564dSmrg
210266e564dSmrg    IceErrorHeader (iceConn,
211266e564dSmrg	0, offendingMinor,
212266e564dSmrg	iceConn->receive_sequence,
213266e564dSmrg	IceFatalToProtocol,
214266e564dSmrg	IceAuthRejected,
215266e564dSmrg	WORD64COUNT (bytes));
216266e564dSmrg
217266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
2183bf3b463Smrg    if (pStart != NULL)
2193bf3b463Smrg    {
2203bf3b463Smrg        STORE_STRING (pBuf, reason);
2213bf3b463Smrg        IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
2223bf3b463Smrg    }
223266e564dSmrg    IceFlush (iceConn);
224266e564dSmrg}
225266e564dSmrg
226266e564dSmrg
227266e564dSmrgvoid
228c5629e66Smrg_IceErrorAuthenticationFailed (
229c5629e66Smrg	IceConn	iceConn,
230c5629e66Smrg	int	offendingMinor,
2319ef0b394Smrg	const char	*reason
232c5629e66Smrg)
233266e564dSmrg{
234266e564dSmrg    char *pBuf, *pStart;
235266e564dSmrg    int bytes;
236266e564dSmrg
237266e564dSmrg    if (!reason)
238266e564dSmrg	reason = "";
239266e564dSmrg    bytes = STRING_BYTES (reason);
240266e564dSmrg
241266e564dSmrg    IceErrorHeader (iceConn,
242266e564dSmrg	0, offendingMinor,
243266e564dSmrg	iceConn->receive_sequence,
244266e564dSmrg	IceFatalToProtocol,
245266e564dSmrg	IceAuthFailed,
246266e564dSmrg	WORD64COUNT (bytes));
247266e564dSmrg
248266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
2493bf3b463Smrg    if (pStart != NULL)
2503bf3b463Smrg    {
2513bf3b463Smrg        STORE_STRING (pBuf, reason);
2523bf3b463Smrg        IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
2533bf3b463Smrg    }
254266e564dSmrg    IceFlush (iceConn);
255266e564dSmrg}
256266e564dSmrg
257266e564dSmrg
258266e564dSmrgvoid
259c5629e66Smrg_IceErrorProtocolDuplicate (
260c5629e66Smrg	IceConn	iceConn,
2619ef0b394Smrg	const char	*protocolName
262c5629e66Smrg)
263266e564dSmrg{
264266e564dSmrg    char *pBuf, *pStart;
265266e564dSmrg    int bytes;
266266e564dSmrg
267266e564dSmrg    if (!protocolName)
268266e564dSmrg	protocolName = "";
269266e564dSmrg    bytes = STRING_BYTES (protocolName);
270266e564dSmrg
271266e564dSmrg    IceErrorHeader (iceConn,
272266e564dSmrg	0, ICE_ProtocolSetup,
273266e564dSmrg	iceConn->receive_sequence,
274266e564dSmrg	IceFatalToProtocol,
275266e564dSmrg	IceProtocolDuplicate,
276266e564dSmrg	WORD64COUNT (bytes));
277266e564dSmrg
278266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
2793bf3b463Smrg    if (pStart != NULL)
2803bf3b463Smrg    {
2813bf3b463Smrg        STORE_STRING (pBuf, protocolName);
2823bf3b463Smrg        IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
2833bf3b463Smrg    }
284266e564dSmrg    IceFlush (iceConn);
285266e564dSmrg}
286266e564dSmrg
287266e564dSmrg
288266e564dSmrgvoid
289c5629e66Smrg_IceErrorMajorOpcodeDuplicate (
290c5629e66Smrg	IceConn	iceConn,
291c5629e66Smrg	int	majorOpcode
292c5629e66Smrg)
293266e564dSmrg{
2949ef0b394Smrg    char mOp[8] = { (char) majorOpcode };
295266e564dSmrg
296266e564dSmrg    IceErrorHeader (iceConn,
297266e564dSmrg	0, ICE_ProtocolSetup,
298266e564dSmrg	iceConn->receive_sequence,
299266e564dSmrg	IceFatalToProtocol,
300266e564dSmrg	IceMajorOpcodeDuplicate,
301266e564dSmrg	1 /* length */);
302266e564dSmrg
3039ef0b394Smrg    IceWriteData (iceConn, 8, mOp);
304266e564dSmrg    IceFlush (iceConn);
305266e564dSmrg}
306266e564dSmrg
307266e564dSmrg
308266e564dSmrgvoid
309c5629e66Smrg_IceErrorUnknownProtocol (
310c5629e66Smrg	IceConn	iceConn,
3119ef0b394Smrg	const char	*protocolName
312c5629e66Smrg)
313266e564dSmrg{
314266e564dSmrg    char *pBuf, *pStart;
315266e564dSmrg    int bytes;
316266e564dSmrg
317266e564dSmrg    if (!protocolName)
318266e564dSmrg	protocolName = "";
319266e564dSmrg    bytes = STRING_BYTES (protocolName);
320266e564dSmrg
321266e564dSmrg    IceErrorHeader (iceConn,
322266e564dSmrg	0, ICE_ProtocolSetup,
323266e564dSmrg	iceConn->receive_sequence,
324266e564dSmrg	IceFatalToProtocol,
325266e564dSmrg	IceUnknownProtocol,
326266e564dSmrg	WORD64COUNT (bytes));
327266e564dSmrg
328266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
3293bf3b463Smrg    if (pStart != NULL)
3303bf3b463Smrg    {
3313bf3b463Smrg        STORE_STRING (pBuf, protocolName);
3323bf3b463Smrg        IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
3333bf3b463Smrg    }
334266e564dSmrg    IceFlush (iceConn);
335266e564dSmrg}
336266e564dSmrg
337266e564dSmrg
338266e564dSmrgvoid
339c5629e66Smrg_IceErrorBadMajor (
340c5629e66Smrg	IceConn	iceConn,
341c5629e66Smrg	int     offendingMajor,
342c5629e66Smrg	int     offendingMinor,
343c5629e66Smrg	int	severity
344c5629e66Smrg)
345266e564dSmrg{
3469ef0b394Smrg    char maj[8] = { (char) offendingMajor };
347266e564dSmrg
348266e564dSmrg    IceErrorHeader (iceConn,
349266e564dSmrg	0, offendingMinor,
350266e564dSmrg	iceConn->receive_sequence,
351266e564dSmrg	severity,
352266e564dSmrg	IceBadMajor,
353266e564dSmrg	1 /* length */);
354266e564dSmrg
3559ef0b394Smrg    IceWriteData (iceConn, 8, maj);
356266e564dSmrg    IceFlush (iceConn);
357266e564dSmrg}
358266e564dSmrg
359266e564dSmrg
360a3129944Smrg
361266e564dSmrg/*
362266e564dSmrg * Default error handler.
363266e564dSmrg */
364266e564dSmrg
365c5629e66Smrgstatic void
366c5629e66Smrg_IceDefaultErrorHandler (
367c5629e66Smrg	IceConn		iceConn,
368c5629e66Smrg	Bool		swap,
369c5629e66Smrg	int		offendingMinorOpcode,
370c5629e66Smrg	unsigned long	offendingSequence,
371c5629e66Smrg	int 		errorClass,
372c5629e66Smrg	int		severity,
373c5629e66Smrg	IcePointer	values
374c5629e66Smrg)
375266e564dSmrg{
3769ef0b394Smrg    const char *str;
3779ef0b394Smrg    char *estr;
378266e564dSmrg    char *pData = (char *) values;
379266e564dSmrg
380266e564dSmrg    switch (offendingMinorOpcode)
381266e564dSmrg    {
382266e564dSmrg        case ICE_ConnectionSetup:
383266e564dSmrg            str = "ConnectionSetup";
384266e564dSmrg	    break;
385266e564dSmrg        case ICE_AuthRequired:
386266e564dSmrg            str = "AuthRequired";
387266e564dSmrg	    break;
388266e564dSmrg        case ICE_AuthReply:
389266e564dSmrg            str = "AuthReply";
390266e564dSmrg	    break;
391266e564dSmrg        case ICE_AuthNextPhase:
392266e564dSmrg            str = "AuthNextPhase";
393266e564dSmrg	    break;
394266e564dSmrg        case ICE_ConnectionReply:
395266e564dSmrg            str = "ConnectionReply";
396266e564dSmrg	    break;
397266e564dSmrg        case ICE_ProtocolSetup:
398266e564dSmrg            str = "ProtocolSetup";
399266e564dSmrg	    break;
400266e564dSmrg        case ICE_ProtocolReply:
401266e564dSmrg            str = "ProtocolReply";
402266e564dSmrg	    break;
403266e564dSmrg        case ICE_Ping:
404266e564dSmrg            str = "Ping";
405266e564dSmrg	    break;
406266e564dSmrg        case ICE_PingReply:
407266e564dSmrg            str = "PingReply";
408266e564dSmrg	    break;
409266e564dSmrg        case ICE_WantToClose:
410266e564dSmrg            str = "WantToClose";
411266e564dSmrg	    break;
412266e564dSmrg        case ICE_NoClose:
413266e564dSmrg            str = "NoClose";
414266e564dSmrg	    break;
415266e564dSmrg	default:
416266e564dSmrg	    str = "";
417266e564dSmrg	}
418266e564dSmrg
419266e564dSmrg    fprintf (stderr, "\n");
420266e564dSmrg
421266e564dSmrg    fprintf (stderr, "ICE error:  Offending minor opcode    = %d (%s)\n",
422266e564dSmrg	offendingMinorOpcode, str);
423266e564dSmrg
424266e564dSmrg    fprintf (stderr, "            Offending sequence number = %lu\n",
425266e564dSmrg	offendingSequence);
426266e564dSmrg
427266e564dSmrg    switch (errorClass)
428266e564dSmrg    {
429266e564dSmrg        case IceBadMinor:
430266e564dSmrg            str = "BadMinor";
431266e564dSmrg            break;
432266e564dSmrg        case IceBadState:
433266e564dSmrg            str = "BadState";
434266e564dSmrg            break;
435266e564dSmrg        case IceBadLength:
436266e564dSmrg            str = "BadLength";
437266e564dSmrg            break;
438266e564dSmrg        case IceBadValue:
439266e564dSmrg            str = "BadValue";
440266e564dSmrg            break;
441266e564dSmrg        case IceBadMajor:
442266e564dSmrg            str = "BadMajor";
443266e564dSmrg            break;
444266e564dSmrg        case IceNoAuth:
445266e564dSmrg            str = "NoAuthentication";
446266e564dSmrg            break;
447266e564dSmrg        case IceNoVersion:
448266e564dSmrg            str = "NoVersion";
449266e564dSmrg            break;
450266e564dSmrg        case IceSetupFailed:
451266e564dSmrg            str = "SetupFailed";
452266e564dSmrg            break;
453266e564dSmrg        case IceAuthRejected:
454266e564dSmrg            str = "AuthenticationRejected";
455266e564dSmrg            break;
456266e564dSmrg        case IceAuthFailed:
457266e564dSmrg            str = "AuthenticationFailed";
458266e564dSmrg            break;
459266e564dSmrg        case IceProtocolDuplicate:
460266e564dSmrg            str = "ProtocolDuplicate";
461266e564dSmrg            break;
462266e564dSmrg        case IceMajorOpcodeDuplicate:
463266e564dSmrg            str = "MajorOpcodeDuplicate";
464266e564dSmrg            break;
465266e564dSmrg        case IceUnknownProtocol:
466266e564dSmrg            str = "UnknownProtocol";
467266e564dSmrg            break;
468266e564dSmrg	default:
469266e564dSmrg	    str = "???";
470266e564dSmrg    }
471266e564dSmrg
472266e564dSmrg    fprintf (stderr, "            Error class               = %s\n", str);
473266e564dSmrg
474266e564dSmrg    if (severity == IceCanContinue)
475266e564dSmrg	str = "CanContinue";
476266e564dSmrg    else if (severity == IceFatalToProtocol)
477266e564dSmrg	str = "FatalToProtocol";
478266e564dSmrg    else if (severity == IceFatalToConnection)
479266e564dSmrg	str = "FatalToConnection";
480266e564dSmrg    else
481266e564dSmrg	str = "???";
482266e564dSmrg
483266e564dSmrg    fprintf (stderr, "            Severity                  = %s\n", str);
484266e564dSmrg
485266e564dSmrg    switch (errorClass)
486266e564dSmrg    {
487266e564dSmrg        case IceBadValue:
488266e564dSmrg        {
489266e564dSmrg	    int offset, length, val;
490266e564dSmrg
491266e564dSmrg	    EXTRACT_CARD32 (pData, swap, offset);
492266e564dSmrg	    EXTRACT_CARD32 (pData, swap, length);
493266e564dSmrg
494266e564dSmrg	    fprintf (stderr,
495266e564dSmrg		"            BadValue Offset           = %d\n", offset);
496266e564dSmrg	    fprintf (stderr,
497266e564dSmrg		"            BadValue Length           = %d\n", length);
498266e564dSmrg
499266e564dSmrg	    if (length <= 4)
500266e564dSmrg	    {
501266e564dSmrg		if (length == 1)
502266e564dSmrg		    val = (int) *pData;
503266e564dSmrg		else if (length == 2)
504266e564dSmrg		{
505266e564dSmrg		    EXTRACT_CARD16 (pData, swap, val);
506266e564dSmrg		}
507266e564dSmrg		else
508266e564dSmrg		{
509266e564dSmrg		    EXTRACT_CARD32 (pData, swap, val);
510266e564dSmrg		}
511266e564dSmrg
512266e564dSmrg		fprintf (stderr,
513266e564dSmrg	            "            BadValue                  = %d\n", val);
514266e564dSmrg	    }
515266e564dSmrg            break;
516266e564dSmrg	}
517266e564dSmrg
518266e564dSmrg        case IceBadMajor:
519266e564dSmrg
520266e564dSmrg	    fprintf (stderr, "Major opcode : %d\n", (int) *pData);
521266e564dSmrg            break;
522266e564dSmrg
523266e564dSmrg        case IceSetupFailed:
524266e564dSmrg
5259ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5269ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5279ef0b394Smrg            free(estr);
528266e564dSmrg            break;
529266e564dSmrg
530266e564dSmrg        case IceAuthRejected:
531266e564dSmrg
5329ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5339ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5349ef0b394Smrg            free(estr);
535266e564dSmrg            break;
536266e564dSmrg
537266e564dSmrg        case IceAuthFailed:
538266e564dSmrg
5399ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5409ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5419ef0b394Smrg            free(estr);
542266e564dSmrg            break;
543266e564dSmrg
544266e564dSmrg        case IceProtocolDuplicate:
545266e564dSmrg
5469ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5479ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5489ef0b394Smrg            free(estr);
549266e564dSmrg            break;
550266e564dSmrg
551266e564dSmrg        case IceMajorOpcodeDuplicate:
552266e564dSmrg
5539ef0b394Smrg            fprintf (stderr, "Major opcode : %d\n", (int) *pData);
554266e564dSmrg            break;
555266e564dSmrg
556266e564dSmrg        case IceUnknownProtocol:
557266e564dSmrg
5589ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5599ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5609ef0b394Smrg            free(estr);
561266e564dSmrg            break;
562266e564dSmrg
563266e564dSmrg	default:
564266e564dSmrg	    break;
565266e564dSmrg    }
566266e564dSmrg
567266e564dSmrg    fprintf (stderr, "\n");
568266e564dSmrg
569266e564dSmrg    if (severity != IceCanContinue)
570266e564dSmrg	exit (1);
571266e564dSmrg}
572266e564dSmrg
573c5629e66SmrgIceErrorHandler   _IceErrorHandler   = _IceDefaultErrorHandler;
574266e564dSmrg
575a3129944Smrg
5769ef0b394Smrg/*
577266e564dSmrg * This procedure sets the ICE error handler to be the specified
578266e564dSmrg * routine.  If NULL is passed in the default error handler is restored.
579266e564dSmrg * The function's return value is the previous error handler.
580266e564dSmrg */
5819ef0b394Smrg
582266e564dSmrgIceErrorHandler
583c5629e66SmrgIceSetErrorHandler (
584c5629e66Smrg	IceErrorHandler handler
585c5629e66Smrg)
586266e564dSmrg{
587266e564dSmrg    IceErrorHandler oldHandler = _IceErrorHandler;
588266e564dSmrg
589266e564dSmrg    if (handler != NULL)
590266e564dSmrg	_IceErrorHandler = handler;
591266e564dSmrg    else
592266e564dSmrg	_IceErrorHandler = _IceDefaultErrorHandler;
593266e564dSmrg
594266e564dSmrg    return (oldHandler);
595266e564dSmrg}
596266e564dSmrg
597266e564dSmrg
598a3129944Smrg
599266e564dSmrg/*
600266e564dSmrg * Default IO error handler.
601266e564dSmrg */
602266e564dSmrg
603c5629e66Smrgstatic void
604c5629e66Smrg_IceDefaultIOErrorHandler (
605c5629e66Smrg	IceConn		iceConn
606c5629e66Smrg)
607266e564dSmrg{
608266e564dSmrg    fprintf (stderr,
609266e564dSmrg	"ICE default IO error handler doing an exit(), pid = %ld, errno = %d\n",
610266e564dSmrg	(long)getpid(), errno);
611266e564dSmrg
612266e564dSmrg    exit (1);
613266e564dSmrg}
614266e564dSmrg
615c5629e66SmrgIceIOErrorHandler _IceIOErrorHandler = _IceDefaultIOErrorHandler;
616266e564dSmrg
617a3129944Smrg
6189ef0b394Smrg/*
619266e564dSmrg * This procedure sets the ICE fatal I/O error handler to be the
620266e564dSmrg * specified routine.  If NULL is passed in the default error
621266e564dSmrg * handler is restored.   The function's return value is the
622266e564dSmrg * previous error handler.
623266e564dSmrg */
6249ef0b394Smrg
625266e564dSmrgIceIOErrorHandler
626c5629e66SmrgIceSetIOErrorHandler (
627c5629e66Smrg	IceIOErrorHandler handler
628c5629e66Smrg)
629266e564dSmrg{
630266e564dSmrg    IceIOErrorHandler oldHandler = _IceIOErrorHandler;
631266e564dSmrg
632266e564dSmrg    if (handler != NULL)
633266e564dSmrg	_IceIOErrorHandler = handler;
634266e564dSmrg    else
635266e564dSmrg	_IceIOErrorHandler = _IceDefaultIOErrorHandler;
636266e564dSmrg
637266e564dSmrg    return (oldHandler);
638266e564dSmrg}
639