misc.c revision 266e564d
1266e564dSmrg/* $Xorg: misc.c,v 1.4 2001/02/09 02:03:26 xorgcvs Exp $ */
2266e564dSmrg/******************************************************************************
3266e564dSmrg
4266e564dSmrg
5266e564dSmrgCopyright 1993, 1998  The Open Group
6266e564dSmrg
7266e564dSmrgPermission to use, copy, modify, distribute, and sell this software and its
8266e564dSmrgdocumentation for any purpose is hereby granted without fee, provided that
9266e564dSmrgthe above copyright notice appear in all copies and that both that
10266e564dSmrgcopyright notice and this permission notice appear in supporting
11266e564dSmrgdocumentation.
12266e564dSmrg
13266e564dSmrgThe above copyright notice and this permission notice shall be included in
14266e564dSmrgall copies or substantial portions of the Software.
15266e564dSmrg
16266e564dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17266e564dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18266e564dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19266e564dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20266e564dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21266e564dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22266e564dSmrg
23266e564dSmrgExcept as contained in this notice, the name of The Open Group shall not be
24266e564dSmrgused in advertising or otherwise to promote the sale, use or other dealings
25266e564dSmrgin this Software without prior written authorization from The Open Group.
26266e564dSmrg
27266e564dSmrgAuthor: Ralph Mor, X Consortium
28266e564dSmrg******************************************************************************/
29266e564dSmrg/* $XFree86: xc/lib/ICE/misc.c,v 1.3 2001/01/17 19:41:29 dawes Exp $ */
30266e564dSmrg
31266e564dSmrg#ifdef WIN32
32266e564dSmrg#define _WILLWINSOCK_
33266e564dSmrg#endif
34266e564dSmrg#ifdef HAVE_CONFIG_H
35266e564dSmrg#include <config.h>
36266e564dSmrg#endif
37266e564dSmrg#include <X11/ICE/ICElib.h>
38266e564dSmrg#include "ICElibint.h"
39266e564dSmrg#include <X11/Xtrans/Xtrans.h>
40266e564dSmrg#include <stdio.h>
41266e564dSmrg#ifdef WIN32
42266e564dSmrg#include <X11/Xwinsock.h>
43266e564dSmrg#include <X11/Xw32defs.h>
44266e564dSmrg#endif
45266e564dSmrg
46266e564dSmrg
47266e564dSmrg/*
48266e564dSmrg * scratch buffer
49266e564dSmrg */
50266e564dSmrg
51266e564dSmrgchar *
52266e564dSmrgIceAllocScratch (iceConn, size)
53266e564dSmrg
54266e564dSmrgIceConn		iceConn;
55266e564dSmrgunsigned long	size;
56266e564dSmrg
57266e564dSmrg{
58266e564dSmrg    if (!iceConn->scratch || size > iceConn->scratch_size)
59266e564dSmrg    {
60266e564dSmrg	if (iceConn->scratch)
61266e564dSmrg	    free (iceConn->scratch);
62266e564dSmrg
63266e564dSmrg	iceConn->scratch = (char *) malloc ((unsigned) size);
64266e564dSmrg	iceConn->scratch_size = size;
65266e564dSmrg    }
66266e564dSmrg
67266e564dSmrg    return (iceConn->scratch);
68266e564dSmrg}
69266e564dSmrg
70266e564dSmrg
71266e564dSmrg
72266e564dSmrg/*
73266e564dSmrg * Output/Input buffer functions
74266e564dSmrg */
75266e564dSmrg
76266e564dSmrgint
77266e564dSmrgIceFlush (iceConn)
78266e564dSmrg
79266e564dSmrgIceConn iceConn;
80266e564dSmrg
81266e564dSmrg{
82266e564dSmrg    _IceWrite (iceConn,
83266e564dSmrg	(unsigned long) (iceConn->outbufptr - iceConn->outbuf),
84266e564dSmrg	iceConn->outbuf);
85266e564dSmrg
86266e564dSmrg    iceConn->outbufptr = iceConn->outbuf;
87266e564dSmrg    return 1;
88266e564dSmrg}
89266e564dSmrg
90266e564dSmrg
91266e564dSmrgint
92266e564dSmrgIceGetOutBufSize (iceConn)
93266e564dSmrg
94266e564dSmrgIceConn iceConn;
95266e564dSmrg
96266e564dSmrg{
97266e564dSmrg    return (iceConn->outbufmax - iceConn->outbuf);
98266e564dSmrg}
99266e564dSmrg
100266e564dSmrg
101266e564dSmrgint
102266e564dSmrgIceGetInBufSize (iceConn)
103266e564dSmrg
104266e564dSmrgIceConn iceConn;
105266e564dSmrg
106266e564dSmrg{
107266e564dSmrg    return (iceConn->inbufmax - iceConn->inbuf);
108266e564dSmrg}
109266e564dSmrg
110266e564dSmrg
111266e564dSmrg
112266e564dSmrg/*
113266e564dSmrg * informational functions
114266e564dSmrg */
115266e564dSmrg
116266e564dSmrgIceConnectStatus
117266e564dSmrgIceConnectionStatus (iceConn)
118266e564dSmrg
119266e564dSmrgIceConn iceConn;
120266e564dSmrg
121266e564dSmrg{
122266e564dSmrg    return (iceConn->connection_status);
123266e564dSmrg}
124266e564dSmrg
125266e564dSmrg
126266e564dSmrgchar *
127266e564dSmrgIceVendor (iceConn)
128266e564dSmrg
129266e564dSmrgIceConn iceConn;
130266e564dSmrg
131266e564dSmrg{
132266e564dSmrg    return strdup(iceConn->vendor);
133266e564dSmrg}
134266e564dSmrg
135266e564dSmrg
136266e564dSmrgchar *
137266e564dSmrgIceRelease (iceConn)
138266e564dSmrg
139266e564dSmrgIceConn iceConn;
140266e564dSmrg
141266e564dSmrg{
142266e564dSmrg    return strdup(iceConn->release);
143266e564dSmrg}
144266e564dSmrg
145266e564dSmrg
146266e564dSmrgint
147266e564dSmrgIceProtocolVersion (iceConn)
148266e564dSmrg
149266e564dSmrgIceConn iceConn;
150266e564dSmrg
151266e564dSmrg{
152266e564dSmrg    return (_IceVersions[iceConn->my_ice_version_index].major_version);
153266e564dSmrg}
154266e564dSmrg
155266e564dSmrg
156266e564dSmrgint
157266e564dSmrgIceProtocolRevision (iceConn)
158266e564dSmrg
159266e564dSmrgIceConn iceConn;
160266e564dSmrg
161266e564dSmrg{
162266e564dSmrg    return (_IceVersions[iceConn->my_ice_version_index].minor_version);
163266e564dSmrg}
164266e564dSmrg
165266e564dSmrg
166266e564dSmrgint
167266e564dSmrgIceConnectionNumber (iceConn)
168266e564dSmrg
169266e564dSmrgIceConn iceConn;
170266e564dSmrg
171266e564dSmrg{
172266e564dSmrg    return (_IceTransGetConnectionNumber (iceConn->trans_conn));
173266e564dSmrg}
174266e564dSmrg
175266e564dSmrg
176266e564dSmrgchar *
177266e564dSmrgIceConnectionString (iceConn)
178266e564dSmrg
179266e564dSmrgIceConn iceConn;
180266e564dSmrg
181266e564dSmrg{
182266e564dSmrg    if (iceConn->connection_string)
183266e564dSmrg    {
184266e564dSmrg	return strdup(iceConn->connection_string);
185266e564dSmrg    }
186266e564dSmrg    else
187266e564dSmrg	return (NULL);
188266e564dSmrg}
189266e564dSmrg
190266e564dSmrg
191266e564dSmrgunsigned long
192266e564dSmrgIceLastSentSequenceNumber (iceConn)
193266e564dSmrg
194266e564dSmrgIceConn iceConn;
195266e564dSmrg
196266e564dSmrg{
197266e564dSmrg    return (iceConn->send_sequence);
198266e564dSmrg}
199266e564dSmrg
200266e564dSmrg
201266e564dSmrgunsigned long
202266e564dSmrgIceLastReceivedSequenceNumber (iceConn)
203266e564dSmrg
204266e564dSmrgIceConn iceConn;
205266e564dSmrg
206266e564dSmrg{
207266e564dSmrg    return (iceConn->receive_sequence);
208266e564dSmrg}
209266e564dSmrg
210266e564dSmrg
211266e564dSmrgBool
212266e564dSmrgIceSwapping (iceConn)
213266e564dSmrg
214266e564dSmrgIceConn iceConn;
215266e564dSmrg
216266e564dSmrg{
217266e564dSmrg    return (iceConn->swap);
218266e564dSmrg}
219266e564dSmrg
220266e564dSmrg
221266e564dSmrg
222266e564dSmrg/*
223266e564dSmrg * Read "n" bytes from a connection.
224266e564dSmrg *
225266e564dSmrg * Return Status 0 if we detected an EXPECTED closed connection.
226266e564dSmrg *
227266e564dSmrg */
228266e564dSmrg
229266e564dSmrgStatus
230266e564dSmrg_IceRead (iceConn, nbytes, ptr)
231266e564dSmrg
232266e564dSmrgregister IceConn iceConn;
233266e564dSmrgunsigned long	 nbytes;
234266e564dSmrgregister char	 *ptr;
235266e564dSmrg
236266e564dSmrg{
237266e564dSmrg    register unsigned long nleft;
238266e564dSmrg
239266e564dSmrg    nleft = nbytes;
240266e564dSmrg    while (nleft > 0)
241266e564dSmrg    {
242266e564dSmrg	int nread;
243266e564dSmrg
244266e564dSmrg	if (iceConn->io_ok)
245266e564dSmrg	    nread = _IceTransRead (iceConn->trans_conn, ptr, (int) nleft);
246266e564dSmrg	else
247266e564dSmrg	    return (1);
248266e564dSmrg
249266e564dSmrg	if (nread <= 0)
250266e564dSmrg	{
251266e564dSmrg#ifdef WIN32
252266e564dSmrg	    errno = WSAGetLastError();
253266e564dSmrg#endif
254266e564dSmrg	    if (iceConn->want_to_close)
255266e564dSmrg	    {
256266e564dSmrg		/*
257266e564dSmrg		 * We sent a WantToClose message and now we detected that
258266e564dSmrg		 * the other side closed the connection.
259266e564dSmrg		 */
260266e564dSmrg
261266e564dSmrg		_IceConnectionClosed (iceConn);	    /* invoke watch procs */
262266e564dSmrg		_IceFreeConnection (iceConn);
263266e564dSmrg
264266e564dSmrg		return (0);
265266e564dSmrg	    }
266266e564dSmrg	    else
267266e564dSmrg	    {
268266e564dSmrg		/*
269266e564dSmrg		 * Fatal IO error.  First notify each protocol's IceIOErrorProc
270266e564dSmrg		 * callback, then invoke the application IO error handler.
271266e564dSmrg		 */
272266e564dSmrg
273266e564dSmrg		iceConn->io_ok = False;
274266e564dSmrg
275266e564dSmrg		if (iceConn->connection_status == IceConnectPending)
276266e564dSmrg		{
277266e564dSmrg		    /*
278266e564dSmrg		     * Don't invoke IO error handler if we are in the
279266e564dSmrg		     * middle of a connection setup.
280266e564dSmrg		     */
281266e564dSmrg
282266e564dSmrg		    return (1);
283266e564dSmrg		}
284266e564dSmrg
285266e564dSmrg		if (iceConn->process_msg_info)
286266e564dSmrg		{
287266e564dSmrg		    int i;
288266e564dSmrg
289266e564dSmrg		    for (i = iceConn->his_min_opcode;
290266e564dSmrg			i <= iceConn->his_max_opcode; i++)
291266e564dSmrg		    {
292266e564dSmrg			_IceProcessMsgInfo *process;
293266e564dSmrg
294266e564dSmrg			process = &iceConn->process_msg_info[
295266e564dSmrg			    i - iceConn->his_min_opcode];
296266e564dSmrg
297266e564dSmrg			if ((process != NULL) && process->in_use)
298266e564dSmrg			{
299266e564dSmrg			    IceIOErrorProc IOErrProc = process->accept_flag ?
300266e564dSmrg			      process->protocol->accept_client->io_error_proc :
301266e564dSmrg			      process->protocol->orig_client->io_error_proc;
302266e564dSmrg
303266e564dSmrg			    if (IOErrProc)
304266e564dSmrg				(*IOErrProc) (iceConn);
305266e564dSmrg			}
306266e564dSmrg		    }
307266e564dSmrg		}
308266e564dSmrg
309266e564dSmrg		(*_IceIOErrorHandler) (iceConn);
310266e564dSmrg		return (1);
311266e564dSmrg	    }
312266e564dSmrg	}
313266e564dSmrg
314266e564dSmrg	nleft -= nread;
315266e564dSmrg	ptr   += nread;
316266e564dSmrg    }
317266e564dSmrg
318266e564dSmrg    return (1);
319266e564dSmrg}
320266e564dSmrg
321266e564dSmrg
322266e564dSmrg
323266e564dSmrg/*
324266e564dSmrg * If we read a message header with a bad major or minor opcode,
325266e564dSmrg * we need to advance to the end of the message.  This way, the next
326266e564dSmrg * message can be processed correctly.
327266e564dSmrg */
328266e564dSmrg
329266e564dSmrgvoid
330266e564dSmrg_IceReadSkip (iceConn, nbytes)
331266e564dSmrg
332266e564dSmrgregister IceConn	iceConn;
333266e564dSmrgregister unsigned long	nbytes;
334266e564dSmrg
335266e564dSmrg{
336266e564dSmrg    char temp[512];
337266e564dSmrg
338266e564dSmrg    while (nbytes > 0)
339266e564dSmrg    {
340266e564dSmrg	unsigned long rbytes = nbytes > 512 ? 512 : nbytes;
341266e564dSmrg
342266e564dSmrg	_IceRead (iceConn, rbytes, temp);
343266e564dSmrg	nbytes -= rbytes;
344266e564dSmrg    }
345266e564dSmrg}
346266e564dSmrg
347266e564dSmrg
348266e564dSmrg
349266e564dSmrg/*
350266e564dSmrg * Write "n" bytes to a connection.
351266e564dSmrg */
352266e564dSmrg
353266e564dSmrgvoid
354266e564dSmrg_IceWrite (iceConn, nbytes, ptr)
355266e564dSmrg
356266e564dSmrgregister IceConn iceConn;
357266e564dSmrgunsigned long	 nbytes;
358266e564dSmrgregister char	 *ptr;
359266e564dSmrg
360266e564dSmrg{
361266e564dSmrg    register unsigned long nleft;
362266e564dSmrg
363266e564dSmrg    nleft = nbytes;
364266e564dSmrg    while (nleft > 0)
365266e564dSmrg    {
366266e564dSmrg	int nwritten;
367266e564dSmrg
368266e564dSmrg	if (iceConn->io_ok)
369266e564dSmrg	    nwritten = _IceTransWrite (iceConn->trans_conn, ptr, (int) nleft);
370266e564dSmrg	else
371266e564dSmrg	    return;
372266e564dSmrg
373266e564dSmrg	if (nwritten <= 0)
374266e564dSmrg	{
375266e564dSmrg#ifdef WIN32
376266e564dSmrg	    errno = WSAGetLastError();
377266e564dSmrg#endif
378266e564dSmrg	    /*
379266e564dSmrg	     * Fatal IO error.  First notify each protocol's IceIOErrorProc
380266e564dSmrg	     * callback, then invoke the application IO error handler.
381266e564dSmrg	     */
382266e564dSmrg
383266e564dSmrg	    iceConn->io_ok = False;
384266e564dSmrg
385266e564dSmrg	    if (iceConn->connection_status == IceConnectPending)
386266e564dSmrg	    {
387266e564dSmrg		/*
388266e564dSmrg		 * Don't invoke IO error handler if we are in the
389266e564dSmrg		 * middle of a connection setup.
390266e564dSmrg		 */
391266e564dSmrg
392266e564dSmrg		return;
393266e564dSmrg	    }
394266e564dSmrg
395266e564dSmrg	    if (iceConn->process_msg_info)
396266e564dSmrg	    {
397266e564dSmrg		int i;
398266e564dSmrg
399266e564dSmrg		for (i = iceConn->his_min_opcode;
400266e564dSmrg		     i <= iceConn->his_max_opcode; i++)
401266e564dSmrg		{
402266e564dSmrg		    _IceProcessMsgInfo *process;
403266e564dSmrg
404266e564dSmrg		    process = &iceConn->process_msg_info[
405266e564dSmrg			i - iceConn->his_min_opcode];
406266e564dSmrg
407266e564dSmrg		    if (process->in_use)
408266e564dSmrg		    {
409266e564dSmrg			IceIOErrorProc IOErrProc = process->accept_flag ?
410266e564dSmrg			    process->protocol->accept_client->io_error_proc :
411266e564dSmrg			    process->protocol->orig_client->io_error_proc;
412266e564dSmrg
413266e564dSmrg			if (IOErrProc)
414266e564dSmrg			    (*IOErrProc) (iceConn);
415266e564dSmrg		    }
416266e564dSmrg		}
417266e564dSmrg	    }
418266e564dSmrg
419266e564dSmrg	    (*_IceIOErrorHandler) (iceConn);
420266e564dSmrg	    return;
421266e564dSmrg	}
422266e564dSmrg
423266e564dSmrg	nleft -= nwritten;
424266e564dSmrg	ptr   += nwritten;
425266e564dSmrg    }
426266e564dSmrg}
427266e564dSmrg
428266e564dSmrg#ifdef WORD64
429266e564dSmrg
430266e564dSmrgIceWriteData16 (iceConn, nbytes, data)
431266e564dSmrg
432266e564dSmrgIceConn 	iceConn;
433266e564dSmrgunsigned long 	nbytes;
434266e564dSmrgshort  		*data;
435266e564dSmrg
436266e564dSmrg{
437266e564dSmrg    int numShorts = nbytes / 2;
438266e564dSmrg    int index = 0;
439266e564dSmrg
440266e564dSmrg    while (index < numShorts)
441266e564dSmrg    {
442266e564dSmrg	int spaceLeft, count, i;
443266e564dSmrg	int shortsLeft = numShorts - index;
444266e564dSmrg
445266e564dSmrg	spaceLeft = iceConn->outbufmax - iceConn->outbufptr - 1;
446266e564dSmrg
447266e564dSmrg	if (spaceLeft < 2)
448266e564dSmrg	{
449266e564dSmrg	    IceFlush (iceConn);
450266e564dSmrg	    spaceLeft = iceConn->outbufmax - iceConn->outbufptr - 1;
451266e564dSmrg	}
452266e564dSmrg
453266e564dSmrg	count = (shortsLeft < spaceLeft / 2) ? shortsLeft : spaceLeft / 2;
454266e564dSmrg
455266e564dSmrg	for (i = 0; i < count; i++)
456266e564dSmrg	    STORE_CARD16 (iceConn->outbufptr, data[index++]);
457266e564dSmrg    }
458266e564dSmrg}
459266e564dSmrg
460266e564dSmrg
461266e564dSmrgIceWriteData32 (iceConn, nbytes, data)
462266e564dSmrg
463266e564dSmrgIceConn 	iceConn;
464266e564dSmrgunsigned long  	nbytes;
465266e564dSmrgint	 	*data;
466266e564dSmrg
467266e564dSmrg{
468266e564dSmrg    int numLongs = nbytes / 4;
469266e564dSmrg    int index = 0;
470266e564dSmrg
471266e564dSmrg    while (index < numLongs)
472266e564dSmrg    {
473266e564dSmrg	int spaceLeft, count, i;
474266e564dSmrg	int longsLeft = numLongs - index;
475266e564dSmrg
476266e564dSmrg	spaceLeft = iceConn->outbufmax - iceConn->outbufptr - 1;
477266e564dSmrg
478266e564dSmrg	if (spaceLeft < 4)
479266e564dSmrg	{
480266e564dSmrg	    IceFlush (iceConn);
481266e564dSmrg	    spaceLeft = iceConn->outbufmax - iceConn->outbufptr - 1;
482266e564dSmrg	}
483266e564dSmrg
484266e564dSmrg	count = (longsLeft < spaceLeft / 4) ? longsLeft : spaceLeft / 4;
485266e564dSmrg
486266e564dSmrg	for (i = 0; i < count; i++)
487266e564dSmrg	    STORE_CARD32 (iceConn->outbufptr, data[index++]);
488266e564dSmrg    }
489266e564dSmrg}
490266e564dSmrg
491266e564dSmrg
492266e564dSmrgIceReadData16 (iceConn, swap, nbytes, data)
493266e564dSmrg
494266e564dSmrgIceConn 	iceConn;
495266e564dSmrgBool		swap;
496266e564dSmrgunsigned long 	nbytes;
497266e564dSmrgshort  		*data;
498266e564dSmrg
499266e564dSmrg{
500266e564dSmrg    /* NOT IMPLEMENTED YET */
501266e564dSmrg}
502266e564dSmrg
503266e564dSmrg
504266e564dSmrgIceReadData32 (iceConn, swap, nbytes, data)
505266e564dSmrg
506266e564dSmrgIceConn 	iceConn;
507266e564dSmrgBool		swap;
508266e564dSmrgunsigned long  	nbytes;
509266e564dSmrgint	 	*data;
510266e564dSmrg
511266e564dSmrg{
512266e564dSmrg    /* NOT IMPLEMENTED YET */
513266e564dSmrg}
514266e564dSmrg
515266e564dSmrg#endif  /* WORD64 */
516266e564dSmrg
517266e564dSmrg
518266e564dSmrg
519266e564dSmrgvoid
520266e564dSmrg_IceAddOpcodeMapping (iceConn, hisOpcode, myOpcode)
521266e564dSmrg
522266e564dSmrgIceConn	iceConn;
523266e564dSmrgint 	hisOpcode;
524266e564dSmrgint 	myOpcode;
525266e564dSmrg
526266e564dSmrg{
527266e564dSmrg    if (hisOpcode <= 0 || hisOpcode > 255)
528266e564dSmrg    {
529266e564dSmrg	return;
530266e564dSmrg    }
531266e564dSmrg    else if (iceConn->process_msg_info == NULL)
532266e564dSmrg    {
533266e564dSmrg	iceConn->process_msg_info = (_IceProcessMsgInfo *) malloc (
534266e564dSmrg	    sizeof (_IceProcessMsgInfo));
535266e564dSmrg	iceConn->his_min_opcode = iceConn->his_max_opcode = hisOpcode;
536266e564dSmrg    }
537266e564dSmrg    else if (hisOpcode < iceConn->his_min_opcode)
538266e564dSmrg    {
539266e564dSmrg	_IceProcessMsgInfo *oldVec = iceConn->process_msg_info;
540266e564dSmrg	int oldsize = iceConn->his_max_opcode - iceConn->his_min_opcode + 1;
541266e564dSmrg	int newsize = iceConn->his_max_opcode - hisOpcode + 1;
542266e564dSmrg	int i;
543266e564dSmrg
544266e564dSmrg	iceConn->process_msg_info = (_IceProcessMsgInfo *) malloc (
545266e564dSmrg	    newsize * sizeof (_IceProcessMsgInfo));
546266e564dSmrg
547266e564dSmrg	memcpy (&iceConn->process_msg_info[
548266e564dSmrg	    iceConn->his_min_opcode - hisOpcode], oldVec,
549266e564dSmrg	    oldsize * sizeof (_IceProcessMsgInfo));
550266e564dSmrg
551266e564dSmrg	free ((char *) oldVec);
552266e564dSmrg
553266e564dSmrg	for (i = hisOpcode + 1; i < iceConn->his_min_opcode; i++)
554266e564dSmrg	{
555266e564dSmrg	    iceConn->process_msg_info[i -
556266e564dSmrg		iceConn->his_min_opcode].in_use = False;
557266e564dSmrg
558266e564dSmrg	    iceConn->process_msg_info[i -
559266e564dSmrg		iceConn->his_min_opcode].protocol = NULL;
560266e564dSmrg	}
561266e564dSmrg
562266e564dSmrg	iceConn->his_min_opcode = hisOpcode;
563266e564dSmrg    }
564266e564dSmrg    else if (hisOpcode > iceConn->his_max_opcode)
565266e564dSmrg    {
566266e564dSmrg	_IceProcessMsgInfo *oldVec = iceConn->process_msg_info;
567266e564dSmrg	int oldsize = iceConn->his_max_opcode - iceConn->his_min_opcode + 1;
568266e564dSmrg	int newsize = hisOpcode - iceConn->his_min_opcode + 1;
569266e564dSmrg	int i;
570266e564dSmrg
571266e564dSmrg	iceConn->process_msg_info = (_IceProcessMsgInfo *) malloc (
572266e564dSmrg	    newsize * sizeof (_IceProcessMsgInfo));
573266e564dSmrg
574266e564dSmrg	memcpy (iceConn->process_msg_info, oldVec,
575266e564dSmrg	    oldsize * sizeof (_IceProcessMsgInfo));
576266e564dSmrg
577266e564dSmrg	free ((char *) oldVec);
578266e564dSmrg
579266e564dSmrg	for (i = iceConn->his_max_opcode + 1; i < hisOpcode; i++)
580266e564dSmrg	{
581266e564dSmrg	    iceConn->process_msg_info[i -
582266e564dSmrg		iceConn->his_min_opcode].in_use = False;
583266e564dSmrg
584266e564dSmrg	    iceConn->process_msg_info[i -
585266e564dSmrg		iceConn->his_min_opcode].protocol = NULL;
586266e564dSmrg	}
587266e564dSmrg
588266e564dSmrg	iceConn->his_max_opcode = hisOpcode;
589266e564dSmrg    }
590266e564dSmrg
591266e564dSmrg    iceConn->process_msg_info[hisOpcode -
592266e564dSmrg	iceConn->his_min_opcode].in_use = True;
593266e564dSmrg
594266e564dSmrg    iceConn->process_msg_info[hisOpcode -
595266e564dSmrg	iceConn->his_min_opcode].my_opcode = myOpcode;
596266e564dSmrg
597266e564dSmrg    iceConn->process_msg_info[hisOpcode -
598266e564dSmrg	iceConn->his_min_opcode].protocol = &_IceProtocols[myOpcode - 1];
599266e564dSmrg}
600266e564dSmrg
601266e564dSmrg
602266e564dSmrg
603266e564dSmrgchar *
604266e564dSmrgIceGetPeerName (IceConn iceConn)
605266e564dSmrg{
606266e564dSmrg    return (_IceTransGetPeerNetworkId (iceConn->trans_conn));
607266e564dSmrg}
608266e564dSmrg
609266e564dSmrg
610266e564dSmrgchar *
611266e564dSmrg_IceGetPeerName (IceConn iceConn)
612266e564dSmrg{
613266e564dSmrg    return (IceGetPeerName(iceConn));
614266e564dSmrg}
615