ICElib.xml revision d17cd367
1d17cd367Smrg<?xml version="1.0" encoding="UTF-8" ?>
2d17cd367Smrg<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
3d17cd367Smrg                   "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
4d17cd367Smrg
5d17cd367Smrg
6d17cd367Smrg
7d17cd367Smrg<book id="icelib">
8d17cd367Smrg
9d17cd367Smrg<bookinfo>
10d17cd367Smrg   <title>Inter-Client Exchange Library</title>
11d17cd367Smrg   <subtitle>X Consortium Standard</subtitle>
12d17cd367Smrg   <releaseinfo>X Version 11, Release 6.4</releaseinfo>
13d17cd367Smrg   <authorgroup>
14d17cd367Smrg     <author>
15d17cd367Smrg       <firstname>Ralph</firstname><surname>Mor</surname>
16d17cd367Smrg       <affiliation><orgname>X Consortium</orgname></affiliation>
17d17cd367Smrg     </author>
18d17cd367Smrg   </authorgroup>
19d17cd367Smrg   <corpname>X Consortium Standard</corpname>
20d17cd367Smrg   <copyright><year>1993</year><holder>X Consortium</holder></copyright>
21d17cd367Smrg   <copyright><year>1994</year><holder>X Consortium</holder></copyright>
22d17cd367Smrg   <copyright><year>1996</year><holder>X Consortium</holder></copyright>
23d17cd367Smrg   <revhistory><revision><revnumber>1.0</revnumber><date></date></revision></revhistory>
24d17cd367Smrg
25d17cd367Smrg<legalnotice>
26d17cd367Smrg<para>
27d17cd367SmrgPermission is hereby granted, free of charge, to any person obtaining a copy
28d17cd367Smrgof this software and associated documentation files (the
29d17cd367Smrg"Software"), to deal in the Software without restriction,
30d17cd367Smrgincluding without limitation the rights to use, copy, modify, merge,
31d17cd367Smrgpublish, distribute, sublicense, and/or sell copies of the Software, and
32d17cd367Smrgto permit persons to whom the Software is furnished to do so, subject to
33d17cd367Smrgthe following conditions:
34d17cd367Smrg</para>
35d17cd367Smrg
36d17cd367Smrg<para>The above copyright notice and this permission notice shall be
37d17cd367Smrgincluded in all copies or substantial portions of the Software.
38d17cd367Smrg</para>
39d17cd367Smrg
40d17cd367Smrg<para>
41d17cd367SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42d17cd367SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43d17cd367SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
44d17cd367SmrgX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
45d17cd367SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
46d17cd367SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
47d17cd367Smrg</para>
48d17cd367Smrg
49d17cd367Smrg<para>
50d17cd367SmrgExcept as contained in this notice, the name of the X Consortium shall not be
51d17cd367Smrgused in advertising or otherwise to promote the sale, use or other dealings
52d17cd367Smrgin this Software without prior written authorization from the X Consortium.
53d17cd367Smrg</para>
54d17cd367Smrg
55d17cd367Smrg</legalnotice>
56d17cd367Smrg</bookinfo>
57d17cd367Smrg
58d17cd367Smrg<chapter id='overview_of_ice'>
59d17cd367Smrg<title>Overview of ICE</title>
60d17cd367Smrg
61d17cd367Smrg<para>
62d17cd367SmrgThere are numerous possible inter-client protocols, with many similarities
63d17cd367Smrgand common needs - authentication, version negotiation, byte
64d17cd367Smrgorder negotiation, and so on.
65d17cd367SmrgThe Inter-Client Exchange (ICE) protocol is intended to provide a framework
66d17cd367Smrgfor building such protocols, allowing them to make use of common negotiation
67d17cd367Smrgmechanisms and to be multiplexed over a single transport connection.
68d17cd367Smrg</para>
69d17cd367Smrg</chapter>
70d17cd367Smrg
71d17cd367Smrg<chapter id='the_ice_library__c_language_interface_to'>
72d17cd367Smrg<title>The ICE Library - C Language Interface to ICE</title>
73d17cd367Smrg
74d17cd367Smrg<para>
75d17cd367SmrgA client that wishes to utilize ICE must first register the protocols it
76d17cd367Smrgunderstands with the ICE library.  Each protocol is dynamically assigned
77d17cd367Smrga major opcode ranging from 1-255 (two clients can use different
78d17cd367Smrgmajor opcodes for the same protocol).  The next step for the client is either
79d17cd367Smrgto open a connection with another client or to wait for connections made
80d17cd367Smrgby other clients.  Authentication may be required.  A client can both
81d17cd367Smrginitiate connections with other clients and be
82d17cd367Smrgwaiting for clients to connect to itself (a nested session manager is an
83d17cd367Smrgexample).  Once an ICE connection is established between the two clients, one
84d17cd367Smrgof the clients needs to initiate a
85d17cd367Smrg<function>ProtocolSetup</function>
86d17cd367Smrgin order to
87d17cd367Smrg"activate" a given protocol.  Once the other client accepts the
88d17cd367Smrg<function>ProtocolSetup</function>
89d17cd367Smrg(once again, authentication may be required), the
90d17cd367Smrgtwo clients are ready to start passing messages specific to that protocol to
91d17cd367Smrgeach other.  Multiple protocols may be active on a single ICE connection.
92d17cd367SmrgClients are responsible for notifying the ICE library when a protocol is no
93d17cd367Smrglonger active on an ICE connection, although ICE does not define how each
94d17cd367Smrgsubprotocol triggers a protocol shutdown.
95d17cd367Smrg</para>
96d17cd367Smrg
97d17cd367Smrg<para>
98d17cd367SmrgThe ICE library utilizes callbacks to process incoming messages.  Using
99d17cd367Smrgcallbacks allows
100d17cd367Smrg<function>ProtocolSetup</function>
101d17cd367Smrgmessages and authentication to happen
102d17cd367Smrgbehind the scenes.  An additional benefit is that messages never need
103d17cd367Smrgto be buffered up by the library when the client blocks waiting for a
104d17cd367Smrgparticular message.
105d17cd367Smrg</para>
106d17cd367Smrg</chapter>
107d17cd367Smrg
108d17cd367Smrg<chapter id='intended_audience'>
109d17cd367Smrg<title>Intended Audience</title>
110d17cd367Smrg
111d17cd367Smrg<para>This document is intended primarily for implementors of protocol libraries
112d17cd367Smrglayered on top of ICE.  Typically, applications that wish to utilize ICE
113d17cd367Smrgwill make calls into individual protocol libraries rather than directly
114d17cd367Smrgmake calls into the ICE library.  However, some applications will have to
115d17cd367Smrgmake some initial calls into the ICE library in order to accept ICE
116d17cd367Smrgconnections (for example, a session manager accepting connections from
117d17cd367Smrgclients).  But in general, protocol libraries should be designed to hide
118d17cd367Smrgthe inner details of ICE from applications.</para>
119d17cd367Smrg</chapter>
120d17cd367Smrg
121d17cd367Smrg<chapter id='header_files_and_library_name'>
122d17cd367Smrg<title>Header Files and Library Name</title>
123d17cd367Smrg
124d17cd367Smrg
125d17cd367Smrg<para>The header file
126d17cd367Smrg&lt;<symbol role='Pn'>X11/ICE/ICElib.h</symbol>&gt;
127d17cd367Smrgdefines all of the ICElib data structures and function prototypes.
128d17cd367Smrg<function>ICElib.h</function>
129d17cd367Smrgincludes the header file
130d17cd367Smrg&lt;<symbol role='Pn'>X11/ICE/ICE.h</symbol>&gt;,
131d17cd367Smrgwhich defines all of the ICElib constants.
132d17cd367SmrgProtocol libraries that need to read and write messages should include
133d17cd367Smrgthe header file
134d17cd367Smrg&lt;<symbol role='Pn'>X11/ICE/ICEmsg.h</symbol>&gt;.</para>
135d17cd367Smrg
136d17cd367Smrg<para>Applications should link against ICElib using -lICE.</para>
137d17cd367Smrg</chapter>
138d17cd367Smrg
139d17cd367Smrg<chapter id='note_on_prefixes'>
140d17cd367Smrg<title>Note on Prefixes</title>
141d17cd367Smrg
142d17cd367Smrg
143d17cd367Smrg<para>The following name prefixes are used in the library to distinguish between
144d17cd367Smrga client that initiates a
145d17cd367Smrg<function>ProtocolSetup</function>
146d17cd367Smrgand a client that
147d17cd367Smrgresponds with a
148d17cd367Smrg<function>ProtocolReply</function></para>
149d17cd367Smrg
150d17cd367Smrg<itemizedlist>
151d17cd367Smrg  <listitem>
152d17cd367Smrg<para><function>IcePo</function>
153d17cd367Smrg- Ice Protocol Originator</para>
154d17cd367Smrg  </listitem>
155d17cd367Smrg  <listitem>
156d17cd367Smrg<para><function>IcePa</function>
157d17cd367Smrg- Ice Protocol Acceptor</para>
158d17cd367Smrg  </listitem>
159d17cd367Smrg</itemizedlist>
160d17cd367Smrg</chapter>
161d17cd367Smrg
162d17cd367Smrg<chapter id='protocol_registration'>
163d17cd367Smrg<title>Protocol Registration</title>
164d17cd367Smrg
165d17cd367Smrg<para>
166d17cd367SmrgIn order for two clients to exchange messages for a given protocol, each
167d17cd367Smrgside must register the protocol with the ICE library.  The purpose of
168d17cd367Smrgregistration is for each side to obtain a major opcode for the protocol
169d17cd367Smrgand to provide callbacks for processing messages and handling authentication.
170d17cd367SmrgThere are two separate registration functions:
171d17cd367Smrg</para>
172d17cd367Smrg
173d17cd367Smrg<itemizedlist>
174d17cd367Smrg  <listitem>
175d17cd367Smrg    <para>
176d17cd367SmrgOne to handle the side that does a
177d17cd367Smrg<function>ProtocolSetup</function>
178d17cd367Smrg    </para>
179d17cd367Smrg  </listitem>
180d17cd367Smrg  <listitem>
181d17cd367Smrg    <para>
182d17cd367SmrgOne to handle the side that responds with a
183d17cd367Smrg<function>ProtocolReply</function>
184d17cd367Smrg    </para>
185d17cd367Smrg  </listitem>
186d17cd367Smrg</itemizedlist>
187d17cd367Smrg
188d17cd367Smrg<para>
189d17cd367SmrgIt is recommended that protocol registration occur before the two clients
190d17cd367Smrgestablish an ICE connection.  If protocol registration occurs after an
191d17cd367SmrgICE connection is created, there can be a brief interval of time in which a
192d17cd367Smrg<function>ProtocolSetup</function>
193d17cd367Smrgis received, but the protocol is not registered.
194d17cd367SmrgIf it is not possible to register a protocol before the creation of an
195d17cd367SmrgICE connection, proper precautions should be taken to avoid the above race
196d17cd367Smrgcondition.
197d17cd367Smrg</para>
198d17cd367Smrg
199d17cd367Smrg
200d17cd367Smrg<para>
201d17cd367SmrgThe <function>IceRegisterForProtocolSetup</function>
202d17cd367Smrgfunction should be called for the client that initiates a
203d17cd367Smrg<function>ProtocolSetup</function>
204d17cd367Smrg</para>
205d17cd367Smrg
206d17cd367Smrg<funcsynopsis>
207d17cd367Smrg<funcprototype>
208d17cd367Smrg  <funcdef>int <function>IceRegisterForProtocolSetup</function></funcdef>
209d17cd367Smrg    <paramdef>char<parameter> *protocol_name</parameter></paramdef>
210d17cd367Smrg    <paramdef>char<parameter> *vendor</parameter></paramdef>
211d17cd367Smrg    <paramdef>char<parameter> *release</parameter></paramdef>
212d17cd367Smrg    <paramdef>int<parameter> *version_count</parameter></paramdef>
213d17cd367Smrg    <paramdef>int<parameter> *version_count</parameter></paramdef>
214d17cd367Smrg    <paramdef>IcePoVersionRec<parameter> *version_recs</parameter></paramdef>
215d17cd367Smrg    <paramdef>int<parameter> auth_names</parameter></paramdef>
216d17cd367Smrg    <paramdef>char<parameter> **auth_names</parameter></paramdef>
217d17cd367Smrg    <paramdef>IcePoAuthProc<parameter> *auth_procs</parameter></paramdef>
218d17cd367Smrg    <paramdef>IceIOErrorProc<parameter> *io_error_proc</parameter></paramdef>
219d17cd367Smrg</funcprototype>
220d17cd367Smrg</funcsynopsis>
221d17cd367Smrg
222d17cd367Smrg
223d17cd367Smrg<variablelist remap='IP'>
224d17cd367Smrg  <varlistentry>
225d17cd367Smrg    <term><emphasis remap='I'>protocol_name</emphasis></term>
226d17cd367Smrg    <listitem>
227d17cd367Smrg      <para>
228d17cd367SmrgA string specifying the name of the protocol to register.
229d17cd367Smrg      </para>
230d17cd367Smrg    </listitem>
231d17cd367Smrg  </varlistentry>
232d17cd367Smrg  <varlistentry>
233d17cd367Smrg    <term><emphasis remap='I'>vendor</emphasis></term>
234d17cd367Smrg    <listitem>
235d17cd367Smrg      <para>A vendor string with semantics specified by the protocol.</para>
236d17cd367Smrg    </listitem>
237d17cd367Smrg  </varlistentry>
238d17cd367Smrg  <varlistentry>
239d17cd367Smrg    <term><emphasis remap='I'>release</emphasis></term>
240d17cd367Smrg    <listitem>
241d17cd367Smrg      <para>A release string with semantics specified by the protocol.</para>
242d17cd367Smrg    </listitem>
243d17cd367Smrg  </varlistentry>
244d17cd367Smrg  <varlistentry>
245d17cd367Smrg    <term><emphasis remap='I'>version_count</emphasis></term>
246d17cd367Smrg    <listitem>
247d17cd367Smrg      <para>The number of different versions of the protocol supported.</para>
248d17cd367Smrg    </listitem>
249d17cd367Smrg  </varlistentry>
250d17cd367Smrg  <varlistentry>
251d17cd367Smrg    <term><emphasis remap='I'>version_recs</emphasis></term>
252d17cd367Smrg    <listitem>
253d17cd367Smrg      <para>List of versions and associated callbacks.</para>
254d17cd367Smrg    </listitem>
255d17cd367Smrg  </varlistentry>
256d17cd367Smrg  <varlistentry>
257d17cd367Smrg    <term><emphasis remap='I'>auth_count</emphasis></term>
258d17cd367Smrg    <listitem>
259d17cd367Smrg      <para>The number of authentication methods supported.</para>
260d17cd367Smrg    </listitem>
261d17cd367Smrg  </varlistentry>
262d17cd367Smrg  <varlistentry>
263d17cd367Smrg    <term><emphasis remap='I'>auth_names</emphasis></term>
264d17cd367Smrg    <listitem>
265d17cd367Smrg      <para>The list of authentication methods supported.</para>
266d17cd367Smrg  </listitem>
267d17cd367Smrg  </varlistentry>
268d17cd367Smrg  <varlistentry>
269d17cd367Smrg    <term><emphasis remap='I'>auth_procs</emphasis></term>
270d17cd367Smrg    <listitem>
271d17cd367Smrg      <para>
272d17cd367SmrgThe list of authentication callbacks, one for each authentication method.
273d17cd367Smrg      </para>
274d17cd367Smrg    </listitem>
275d17cd367Smrg  </varlistentry>
276d17cd367Smrg  <varlistentry>
277d17cd367Smrg    <term><emphasis remap='I'>io_error_proc</emphasis></term>
278d17cd367Smrg    <listitem>
279d17cd367Smrg      <para>IO error handler, or NULL.</para>
280d17cd367Smrg    </listitem>
281d17cd367Smrg  </varlistentry>
282d17cd367Smrg</variablelist>
283d17cd367Smrg
284d17cd367Smrg
285d17cd367Smrg<para>
286d17cd367Smrg<function>IceRegisterForProtocolSetup</function> returns the major
287d17cd367Smrgopcode reserved or -1 if an error occurred.  In order to actually activate
288d17cd367Smrgthe protocol, the <function>IceProtocolSetup</function>
289d17cd367Smrgfunction needs to be called with this major opcode.  Once the protocol is
290d17cd367Smrgactivated, all messages for the protocol should be sent using this major
291d17cd367Smrgopcode.
292d17cd367Smrg</para>
293d17cd367Smrg
294d17cd367Smrg<para>
295d17cd367SmrgA protocol library may support multiple versions of the same protocol.
296d17cd367SmrgThe version_recs argument specifies a list of supported versions of the
297d17cd367Smrgprotocol, which are prioritized in decreasing order of preference.
298d17cd367SmrgEach version record consists of a major and minor version of the protocol
299d17cd367Smrgas well as a callback to be used for processing incoming messages.
300d17cd367Smrg</para>
301d17cd367Smrg
302d17cd367Smrg
303d17cd367Smrg<literallayout remap='Ds'>
304d17cd367Smrgtypedef struct {
305d17cd367Smrg	int major_version;
306d17cd367Smrg	int minor_version;
307d17cd367Smrg	IcePoProcessMsgProc process_msg_proc;
308d17cd367Smrg} IcePoVersionRec;
309d17cd367Smrg</literallayout>
310d17cd367Smrg
311d17cd367Smrg<para>The
312d17cd367Smrg<function>IcePoProcessMsgProc</function>
313d17cd367Smrgcallback is responsible for processing the set of messages that can be
314d17cd367Smrgreceived by the client that initiated the
315d17cd367Smrg<function>ProtocolSetup</function>
316d17cd367SmrgFor further information,
317d17cd367Smrgsee
318d17cd367Smrg<link linkend="callbacks_for_processing_messages">
319d17cd367Smrg<xref linkend="callbacks_for_processing_messages"></xref></link>.</para>
320d17cd367Smrg
321d17cd367Smrg<para>Authentication may be required before the protocol can become active.
322d17cd367SmrgThe protocol library must register the authentication methods that it
323d17cd367Smrgsupports with the ICE library.
324d17cd367SmrgThe auth_names and auth_procs arguments are a list of authentication names
325d17cd367Smrgand callbacks that are  prioritized in decreasing order of preference.
326d17cd367SmrgFor information on the
327d17cd367Smrg<function>IcePoAuthProc</function>
328d17cd367Smrgcallback, see
329d17cd367Smrg<link linkend="authentication_methods">
330d17cd367Smrg<xref linkend="authentication_methods"></xref></link>
331d17cd367Smrg</para>
332d17cd367Smrg
333d17cd367Smrg<para>The
334d17cd367Smrg<function>IceIOErrorProc</function>
335d17cd367Smrgcallback is invoked if the ICE connection unexpectedly breaks.
336d17cd367SmrgYou should pass NULL for io_error_proc if not interested in being notified.
337d17cd367SmrgFor further information,
338d17cd367Smrg<link linkend="error_handling">
339d17cd367Smrg<xref linkend="error_handling"></xref></link>
340d17cd367Smrg</para>
341d17cd367Smrg
342d17cd367Smrg
343d17cd367Smrg<para>The
344d17cd367Smrg<function>IceRegisterForProtocolReply</function>
345d17cd367Smrgfunction should be called for the client that responds to a
346d17cd367Smrg<function>ProtocolSetup</function>
347d17cd367Smrgwith a
348d17cd367Smrg<function>ProtocolReply</function></para>
349d17cd367Smrg
350d17cd367Smrg
351d17cd367Smrg<funcsynopsis>
352d17cd367Smrg<funcprototype>
353d17cd367Smrg  <funcdef>Bool <function>IceRegisterForProtocolReply</function></funcdef>
354d17cd367Smrg    <paramdef>char<parameter> *host_name</parameter></paramdef>
355d17cd367Smrg</funcprototype>
356d17cd367Smrg</funcsynopsis>
357d17cd367Smrg
358d17cd367Smrg<variablelist remap='IP'>
359d17cd367Smrg  <varlistentry>
360d17cd367Smrg    <term><emphasis remap='I'>protocol_name</emphasis></term>
361d17cd367Smrg    <listitem><para>A string specifying the name of the protocol to register.</para></listitem>
362d17cd367Smrg  </varlistentry>
363d17cd367Smrg  <varlistentry>
364d17cd367Smrg  <term><emphasis remap='I'>vendor</emphasis></term>
365d17cd367Smrg  <listitem>
366d17cd367Smrg<para>A vendor string with semantics specified by the protocol.</para>
367d17cd367Smrg  </listitem>
368d17cd367Smrg  </varlistentry>
369d17cd367Smrg  <varlistentry>
370d17cd367Smrg  <term><emphasis remap='I'>release</emphasis></term>
371d17cd367Smrg  <listitem>
372d17cd367Smrg<para>A release string with semantics specified by the protocol.</para>
373d17cd367Smrg  </listitem>
374d17cd367Smrg  </varlistentry>
375d17cd367Smrg  <varlistentry>
376d17cd367Smrg  <term><emphasis remap='I'>version_count</emphasis></term>
377d17cd367Smrg  <listitem>
378d17cd367Smrg<para>The number of different versions of the protocol supported.</para>
379d17cd367Smrg  </listitem>
380d17cd367Smrg  </varlistentry>
381d17cd367Smrg  <varlistentry>
382d17cd367Smrg  <term><emphasis remap='I'>version_recs</emphasis></term>
383d17cd367Smrg  <listitem>
384d17cd367Smrg<para>List of versions and associated callbacks.</para>
385d17cd367Smrg  </listitem>
386d17cd367Smrg  </varlistentry>
387d17cd367Smrg  <varlistentry>
388d17cd367Smrg  <term><emphasis remap='I'>auth_count</emphasis></term>
389d17cd367Smrg  <listitem>
390d17cd367Smrg<para>The number of authentication methods supported.</para>
391d17cd367Smrg  </listitem>
392d17cd367Smrg  </varlistentry>
393d17cd367Smrg  <varlistentry>
394d17cd367Smrg  <term><emphasis remap='I'>auth_names</emphasis></term>
395d17cd367Smrg  <listitem>
396d17cd367Smrg<para>The list of authentication methods supported.</para>
397d17cd367Smrg  </listitem>
398d17cd367Smrg  </varlistentry>
399d17cd367Smrg  <varlistentry>
400d17cd367Smrg  <term><emphasis remap='I'>auth_procs</emphasis></term>
401d17cd367Smrg  <listitem>
402d17cd367Smrg<para>The list of authentication callbacks, one for each authentication method.</para>
403d17cd367Smrg  </listitem>
404d17cd367Smrg  </varlistentry>
405d17cd367Smrg  <varlistentry>
406d17cd367Smrg  <term><emphasis remap='I'>host_based_auth_proc</emphasis></term>
407d17cd367Smrg  <listitem>
408d17cd367Smrg<para>Host based authentication callback.</para>
409d17cd367Smrg  </listitem>
410d17cd367Smrg  </varlistentry>
411d17cd367Smrg  <varlistentry>
412d17cd367Smrg  <term><emphasis remap='I'>protocol_setup_proc</emphasis></term>
413d17cd367Smrg  <listitem>
414d17cd367Smrg<para>A callback to be invoked when authentication has succeeded for a
415d17cd367Smrg<function>ProtocolSetup</function>
416d17cd367Smrgbut before the
417d17cd367Smrg<function>ProtocolReply</function>
418d17cd367Smrgis sent.</para>
419d17cd367Smrg  </listitem>
420d17cd367Smrg  </varlistentry>
421d17cd367Smrg  <varlistentry>
422d17cd367Smrg  <term><emphasis remap='I'>protocol_activate_proc</emphasis></term>
423d17cd367Smrg  <listitem>
424d17cd367Smrg<para>A callback to be invoked after the
425d17cd367Smrg<function>ProtocolReply</function>
426d17cd367Smrgis sent.</para>
427d17cd367Smrg  </listitem>
428d17cd367Smrg  </varlistentry>
429d17cd367Smrg  <varlistentry>
430d17cd367Smrg  <term><emphasis remap='I'>io_error_proc</emphasis></term>
431d17cd367Smrg  <listitem>
432d17cd367Smrg<para>IO error handler, or NULL.</para>
433d17cd367Smrg  </listitem>
434d17cd367Smrg  </varlistentry>
435d17cd367Smrg</variablelist>
436d17cd367Smrg
437d17cd367Smrg
438d17cd367Smrg<para><function>IceRegisterForProtocolReply</function>
439d17cd367Smrgreturns the major opcode reserved or -1 if an error occurred.  The major
440d17cd367Smrgopcode should be used in all subsequent messages sent for this protocol.</para>
441d17cd367Smrg
442d17cd367Smrg<para>A protocol library may support multiple versions of the same protocol.
443d17cd367SmrgThe version_recs argument specifies a list of supported versions of the protocol,
444d17cd367Smrgwhich are prioritized in decreasing order of preference.
445d17cd367SmrgEach version record consists of a major and minor version of the protocol
446d17cd367Smrgas well as a callback to be used for processing incoming messages.</para>
447d17cd367Smrg
448d17cd367Smrg
449d17cd367Smrg<literallayout remap='Ds'>
450d17cd367Smrgtypedef struct {
451d17cd367Smrg	int major_version;
452d17cd367Smrg	int minor_version;
453d17cd367Smrg	IcePaProcessMsgProc process_msg_proc;
454d17cd367Smrg} IcePaVersionRec;
455d17cd367Smrg</literallayout>
456d17cd367Smrg
457d17cd367Smrg
458d17cd367Smrg<para>The
459d17cd367Smrg<function>IcePaProcessMsgProc</function>
460d17cd367Smrgcallback is responsible for processing the set of messages that can be
461d17cd367Smrgreceived by the client that accepted the
462d17cd367Smrg<function>ProtocolSetup</function>
463d17cd367SmrgFor further information,
464d17cd367Smrgsee
465d17cd367Smrg<link linkend="callbacks_for_processing_messages">
466d17cd367Smrg<xref linkend="callbacks_for_processing_messages"></xref></link>
467d17cd367Smrg</para>
468d17cd367Smrg
469d17cd367Smrg<para>Authentication may be required before the protocol can become active.
470d17cd367SmrgThe protocol library must register the authentication methods that it
471d17cd367Smrgsupports with the ICE library.
472d17cd367SmrgThe auth_names and auth_procs arguments are a list of authentication names
473d17cd367Smrgand callbacks that are prioritized in decreasing order of preference.
474d17cd367SmrgFor information on the
475d17cd367Smrg<function>IcePaAuthProc</function>,
476d17cd367SmrgSee
477d17cd367Smrg<link linkend="authentication_methods">
478d17cd367Smrg<xref linkend="authentication_methods"></xref></link>
479d17cd367Smrg
480d17cd367Smrg</para>
481d17cd367Smrg
482d17cd367Smrg<para>If authentication fails and the client attempting to initiate
483d17cd367Smrgthe
484d17cd367Smrg<function>ProtocolSetup</function>
485d17cd367Smrghas not required authentication, the
486d17cd367Smrg<function>IceHostBasedAuthProc</function>
487d17cd367Smrgcallback is invoked with the host name of the originating client.
488d17cd367SmrgIf the callback returns
489d17cd367Smrg<function>True</function>
490d17cd367Smrgthe
491d17cd367Smrg<function>ProtocolSetup</function>
492d17cd367Smrgwill succeed, even though the original
493d17cd367Smrgauthentication failed.
494d17cd367SmrgNote that authentication can effectively be disabled by registering an
495d17cd367Smrg<function>IceHostBasedAuthProc</function>
496d17cd367Smrgwhich always returns
497d17cd367Smrg<function>True</function>
498d17cd367SmrgIf no host based
499d17cd367Smrgauthentication is allowed, you should pass NULL for host_based_auth_proc.</para>
500d17cd367Smrg
501d17cd367Smrg<funcsynopsis>
502d17cd367Smrg<funcprototype>
503d17cd367Smrg  <funcdef>Bool <function>HostBasedAuthProc</function></funcdef>
504d17cd367Smrg    <paramdef>char<parameter> *host_name</parameter></paramdef>
505d17cd367Smrg</funcprototype>
506d17cd367Smrg</funcsynopsis>
507d17cd367Smrg
508d17cd367Smrg<variablelist remap='IP'>
509d17cd367Smrg  <varlistentry>
510d17cd367Smrg    <term><emphasis remap='I'>protocol_name</emphasis></term>
511d17cd367Smrg    <listitem><para>The host name of the client that sent the <function>ProtocolSetup</function></para></listitem>
512d17cd367Smrg  </varlistentry>
513d17cd367Smrg</variablelist>
514d17cd367Smrg
515d17cd367Smrg
516d17cd367Smrg<para>The host_name argument is a string of the form <emphasis remap='I'>protocol</emphasis>/<emphasis remap='I'>hostname</emphasis>,
517d17cd367Smrgwhere <emphasis remap='I'>protocol</emphasis> is one of {tcp, decnet, local}.</para>
518d17cd367Smrg
519d17cd367Smrg<para>Because
520d17cd367Smrg<function>ProtocolSetup</function>
521d17cd367Smrgmessages and authentication happen behind the scenes
522d17cd367Smrgvia callbacks, the protocol library needs some way of being notified when the
523d17cd367Smrg<function>ProtocolSetup</function>
524d17cd367Smrghas completed.
525d17cd367SmrgThis occurs in two phases.
526d17cd367SmrgIn the first phase, the
527d17cd367Smrg<function>IceProtocolSetupProc</function>
528d17cd367Smrgcallback is invoked after authentication has
529d17cd367Smrgsuccessfully completed but before the ICE library sends a
530d17cd367Smrg<function>ProtocolReply</function>
531d17cd367SmrgAny resources required for this protocol should be allocated at this time.
532d17cd367SmrgIf the
533d17cd367Smrg<function>IceProtocolSetupProc</function>
534d17cd367Smrgreturns a successful status, the ICE library will
535d17cd367Smrgsend the
536d17cd367Smrg<function>ProtocolReply</function>
537d17cd367Smrgand then invoke the
538d17cd367Smrg<function>IceProtocolActivateProc</function>
539d17cd367Smrgcallback.  Otherwise, an error will be sent to the
540d17cd367Smrgother client in response to the
541d17cd367Smrg<function>ProtocolSetup</function></para>
542d17cd367Smrg
543d17cd367Smrg<para>The
544d17cd367Smrg<function>IceProtocolActivateProc</function>
545d17cd367Smrgis an optional callback and should be registered only if the protocol
546d17cd367Smrglibrary intends to generate a message immediately following the
547d17cd367Smrg<function>ProtocolReply</function>
548d17cd367SmrgYou should pass NULL for protocol_activate_proc if not interested
549d17cd367Smrgin this callback.</para>
550d17cd367Smrg
551d17cd367Smrg<funcsynopsis>
552d17cd367Smrg<funcprototype>
553d17cd367Smrg  <funcdef>Status <function>ProtocolSetupProc</function></funcdef>
554d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
555d17cd367Smrg    <paramdef>int<parameter> major_version</parameter></paramdef>
556d17cd367Smrg    <paramdef>int<parameter> minor_version</parameter></paramdef>
557d17cd367Smrg    <paramdef>char<parameter> *vendor</parameter></paramdef>
558d17cd367Smrg    <paramdef>char<parameter> *release</parameter></paramdef>
559d17cd367Smrg    <paramdef>IcePointer<parameter> *client_data_ret</parameter></paramdef>
560d17cd367Smrg    <paramdef>char<parameter> **failure_reason_ret</parameter></paramdef>
561d17cd367Smrg</funcprototype>
562d17cd367Smrg</funcsynopsis>
563d17cd367Smrg
564d17cd367Smrg<variablelist remap='IP'>
565d17cd367Smrg  <varlistentry>
566d17cd367Smrg    <term><emphasis remap='I'>protocol_name</emphasis></term>
567d17cd367Smrg    <listitem>
568d17cd367Smrg<para>The ICE connection object.</para>
569d17cd367Smrg  </listitem>
570d17cd367Smrg  </varlistentry>
571d17cd367Smrg  <varlistentry>
572d17cd367Smrg  <term><emphasis remap='I'>major_version</emphasis></term>
573d17cd367Smrg  <listitem>
574d17cd367Smrg<para>The major version of the protocol.</para>
575d17cd367Smrg  </listitem>
576d17cd367Smrg  </varlistentry>
577d17cd367Smrg  <varlistentry>
578d17cd367Smrg  <term><emphasis remap='I'>minor_version</emphasis></term>
579d17cd367Smrg  <listitem>
580d17cd367Smrg<para>The minor version of the protocol.</para>
581d17cd367Smrg  </listitem>
582d17cd367Smrg  </varlistentry>
583d17cd367Smrg  <varlistentry>
584d17cd367Smrg  <term><emphasis remap='I'>vendor</emphasis></term>
585d17cd367Smrg  <listitem>
586d17cd367Smrg<para>The vendor string registered by the protocol originator.</para>
587d17cd367Smrg  </listitem>
588d17cd367Smrg  </varlistentry>
589d17cd367Smrg  <varlistentry>
590d17cd367Smrg  <term><emphasis remap='I'>release</emphasis></term>
591d17cd367Smrg  <listitem>
592d17cd367Smrg<para>The release string registered by the protocol originator.</para>
593d17cd367Smrg  </listitem>
594d17cd367Smrg  </varlistentry>
595d17cd367Smrg  <varlistentry>
596d17cd367Smrg  <term><emphasis remap='I'>client_data_ret</emphasis></term>
597d17cd367Smrg  <listitem>
598d17cd367Smrg<para>Client data to be set by callback.</para>
599d17cd367Smrg  </listitem>
600d17cd367Smrg  </varlistentry>
601d17cd367Smrg  <varlistentry>
602d17cd367Smrg  <term><emphasis remap='I'>failure_reason_ret</emphasis></term>
603d17cd367Smrg  <listitem>
604d17cd367Smrg<para>Failure reason returned.</para>
605d17cd367Smrg  </listitem>
606d17cd367Smrg  </varlistentry>
607d17cd367Smrg</variablelist>
608d17cd367Smrg
609d17cd367Smrg<para>The pointer stored in the client_data_ret argument will be passed
610d17cd367Smrgto the
611d17cd367Smrg<function>IcePaProcessMsgProc</function>
612d17cd367Smrgcallback whenever a message has arrived for this protocol on the
613d17cd367SmrgICE connection.</para>
614d17cd367Smrg
615d17cd367Smrg<para>The vendor and release strings should be freed with
616d17cd367Smrg<function>free</function>
617d17cd367Smrgwhen they are no longer needed.</para>
618d17cd367Smrg
619d17cd367Smrg<para>If a failure occurs, the
620d17cd367Smrg<function>IceProtocolSetupProc</function>
621d17cd367Smrgshould return a zero status as well as allocate and return a failure
622d17cd367Smrgreason string in failure_reason_ret.
623d17cd367SmrgThe ICE library will be responsible for freeing this memory.</para>
624d17cd367Smrg
625d17cd367Smrg<para>The
626d17cd367Smrg<function>IceProtocolActivateProc</function>
627d17cd367Smrgcallback is defined as follows:</para>
628d17cd367Smrg
629d17cd367Smrg<funcsynopsis>
630d17cd367Smrg<funcprototype>
631d17cd367Smrg  <funcdef>void <function>ProtocolActivateProc</function></funcdef>
632d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
633d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
634d17cd367Smrg</funcprototype>
635d17cd367Smrg</funcsynopsis>
636d17cd367Smrg
637d17cd367Smrg<variablelist remap='IP'>
638d17cd367Smrg  <varlistentry>
639d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
640d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
641d17cd367Smrg  </varlistentry>
642d17cd367Smrg  <varlistentry>
643d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
644d17cd367Smrg    <listitem>
645d17cd367Smrg    <para>
646d17cd367SmrgThe client data set in the <function>IceProtocolSetupProc</function> callback.
647d17cd367Smrg    </para>
648d17cd367Smrg    </listitem>
649d17cd367Smrg  </varlistentry>
650d17cd367Smrg</variablelist>
651d17cd367Smrg
652d17cd367Smrg
653d17cd367Smrg<para>The
654d17cd367Smrg<function>IceIOErrorProc</function>
655d17cd367Smrgcallback is invoked if the ICE connection unexpectedly breaks.
656d17cd367SmrgYou should pass NULL for io_error_proc if not interested in being notified.
657d17cd367SmrgFor further information,
658d17cd367Smrgsee
659d17cd367Smrg<link linkend="error_handling">
660d17cd367Smrg<xref linkend="error_handling"></xref></link>
661d17cd367Smrg</para>
662d17cd367Smrg
663d17cd367Smrg<sect1 id='callbacks_for_processing_messages'>
664d17cd367Smrg<title>Callbacks for Processing Messages</title>
665d17cd367Smrg
666d17cd367Smrg<para>When an application detects that there is new data to read on an ICE
667d17cd367Smrgconnection (via
668d17cd367Smrg<function>select</function>
669d17cd367Smrgit calls the
670d17cd367Smrg<function>IceProcessMessages</function>
671d17cd367Smrgfunction
672d17cd367Smrg<link linkend="processing_messages">
673d17cd367Smrg<xref linkend="processing_messages"></xref></link>.
674d17cd367Smrg
675d17cd367SmrgWhen
676d17cd367Smrg<function>IceProcessMessages</function>
677d17cd367Smrgreads an ICE message header with a major opcode other than
678d17cd367Smrgzero (reserved for the ICE protocol), it needs to call a function that will
679d17cd367Smrgread the rest of the message, unpack it, and process it accordingly.</para>
680d17cd367Smrg
681d17cd367Smrg<para>If the message arrives at the client that initiated the
682d17cd367Smrg<function>ProtocolSetup</function>
683d17cd367Smrgthe
684d17cd367Smrg<function>IcePoProcessMsgProc</function>
685d17cd367Smrgcallback is invoked.</para>
686d17cd367Smrg
687d17cd367Smrg<funcsynopsis>
688d17cd367Smrg<funcprototype>
689d17cd367Smrg  <funcdef>void <function>PoProcessMsgProc</function></funcdef>
690d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
691d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
692d17cd367Smrg    <paramdef>int<parameter> opcode</parameter></paramdef>
693d17cd367Smrg    <paramdef>unsigned long<parameter> length</parameter></paramdef>
694d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
695d17cd367Smrg    <paramdef>IceReplyWaitInfo<parameter> *reply_wait</parameter></paramdef>
696d17cd367Smrg    <paramdef>Bool<parameter> *reply_ready_ret</parameter></paramdef>
697d17cd367Smrg</funcprototype>
698d17cd367Smrg</funcsynopsis>
699d17cd367Smrg
700d17cd367Smrg<variablelist remap='IP'>
701d17cd367Smrg  <varlistentry>
702d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
703d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
704d17cd367Smrg  </varlistentry>
705d17cd367Smrg  <varlistentry>
706d17cd367Smrg  <term><emphasis remap='I'>client_data</emphasis></term>
707d17cd367Smrg  <listitem>
708d17cd367Smrg<para>Client data associated with this protocol on the ICE connection.</para>
709d17cd367Smrg  </listitem>
710d17cd367Smrg  </varlistentry>
711d17cd367Smrg  <varlistentry>
712d17cd367Smrg  <term><emphasis remap='I'>opcode</emphasis></term>
713d17cd367Smrg  <listitem>
714d17cd367Smrg<para>The minor opcode of the message.</para>
715d17cd367Smrg  </listitem>
716d17cd367Smrg  </varlistentry>
717d17cd367Smrg  <varlistentry>
718d17cd367Smrg  <term><emphasis remap='I'>length</emphasis></term>
719d17cd367Smrg  <listitem>
720d17cd367Smrg<para>The length (in 8-byte units) of the message beyond the ICE header.</para>
721d17cd367Smrg  </listitem>
722d17cd367Smrg  </varlistentry>
723d17cd367Smrg  <varlistentry>
724d17cd367Smrg  <term><emphasis remap='I'>swap</emphasis></term>
725d17cd367Smrg  <listitem>
726d17cd367Smrg<para>A flag that indicates if byte swapping is necessary.</para>
727d17cd367Smrg  </listitem>
728d17cd367Smrg  </varlistentry>
729d17cd367Smrg  <varlistentry>
730d17cd367Smrg  <term><emphasis remap='I'>reply_wait</emphasis></term>
731d17cd367Smrg  <listitem>
732d17cd367Smrg<para>Indicates if the invoking client is waiting for a reply.</para>
733d17cd367Smrg  </listitem>
734d17cd367Smrg  </varlistentry>
735d17cd367Smrg  <varlistentry>
736d17cd367Smrg  <term><emphasis remap='I'>reply_ready_ret</emphasis></term>
737d17cd367Smrg  <listitem>
738d17cd367Smrg<para>If set to
739d17cd367Smrg<function>True</function>
740d17cd367Smrga reply is ready.</para>
741d17cd367Smrg  </listitem>
742d17cd367Smrg  </varlistentry>
743d17cd367Smrg</variablelist>
744d17cd367Smrg
745d17cd367Smrg
746d17cd367Smrg<para>If the message arrives at the client that accepted the
747d17cd367Smrg<function>ProtocolSetup</function>
748d17cd367Smrgthe
749d17cd367Smrg<function>IcePaProcessMsgProc</function>
750d17cd367Smrgcallback is invoked.</para>
751d17cd367Smrg
752d17cd367Smrg
753d17cd367Smrg<funcsynopsis>
754d17cd367Smrg<funcprototype>
755d17cd367Smrg  <funcdef>void <function>IcePaProcessMsgProc</function></funcdef>
756d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
757d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
758d17cd367Smrg    <paramdef>int<parameter> opcode</parameter></paramdef>
759d17cd367Smrg    <paramdef>unsigned long<parameter> length</parameter></paramdef>
760d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
761d17cd367Smrg</funcprototype>
762d17cd367Smrg</funcsynopsis>
763d17cd367Smrg
764d17cd367Smrg<variablelist remap='IP'>
765d17cd367Smrg  <varlistentry>
766d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
767d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
768d17cd367Smrg  </varlistentry>
769d17cd367Smrg  <varlistentry>
770d17cd367Smrg  <term><emphasis remap='I'>client_data</emphasis></term>
771d17cd367Smrg  <listitem>
772d17cd367Smrg<para>Client data associated with this protocol on the ICE connection.</para>
773d17cd367Smrg  </listitem>
774d17cd367Smrg  </varlistentry>
775d17cd367Smrg  <varlistentry>
776d17cd367Smrg  <term><emphasis remap='I'>opcode</emphasis></term>
777d17cd367Smrg  <listitem>
778d17cd367Smrg<para>The minor opcode of the message.</para>
779d17cd367Smrg  </listitem>
780d17cd367Smrg  </varlistentry>
781d17cd367Smrg  <varlistentry>
782d17cd367Smrg  <term><emphasis remap='I'>length</emphasis></term>
783d17cd367Smrg  <listitem>
784d17cd367Smrg<para>The length (in 8-byte units) of the message beyond the ICE header.</para>
785d17cd367Smrg  </listitem>
786d17cd367Smrg  </varlistentry>
787d17cd367Smrg  <varlistentry>
788d17cd367Smrg  <term><emphasis remap='I'>swap</emphasis></term>
789d17cd367Smrg  <listitem>
790d17cd367Smrg<para>A flag that indicates if byte swapping is necessary.</para>
791d17cd367Smrg  </listitem>
792d17cd367Smrg  </varlistentry>
793d17cd367Smrg</variablelist>
794d17cd367Smrg
795d17cd367Smrg
796d17cd367Smrg<para>In order to read the message, both of these callbacks should use the
797d17cd367Smrgmacros defined for this purpose (see
798d17cd367Smrg<link linkend="reading_ice_messages">
799d17cd367Smrg<xref linkend="reading_ice_messages"></xref></link>.).
800d17cd367SmrgNote that byte swapping may be necessary.
801d17cd367SmrgAs a convenience, the length field in the ICE header will be swapped by ICElib
802d17cd367Smrgif necessary.</para>
803d17cd367Smrg
804d17cd367Smrg<para>In both of these callbacks, the client_data argument is a pointer to client
805d17cd367Smrgdata that was registered at
806d17cd367Smrg<function>ProtocolSetup</function>
807d17cd367Smrgtime.
808d17cd367SmrgIn the case of
809d17cd367Smrg<function>IcePoProcessMsgProc</function>
810d17cd367Smrgthe client data was set in the call to
811d17cd367Smrg<function>IceProtocolSetup</function>
812d17cd367SmrgIn the case of
813d17cd367Smrg<function>IcePaProcessMsgProc</function>
814d17cd367Smrgthe client data was set in the
815d17cd367Smrg<function>IceProtocolSetupProc</function>
816d17cd367Smrgcallback.</para>
817d17cd367Smrg
818d17cd367Smrg<para>The
819d17cd367Smrg<function>IcePoProcessMsgProc</function>
820d17cd367Smrgcallback needs to check the reply_wait argument.
821d17cd367SmrgIf reply_wait is NULL ,
822d17cd367Smrgthe ICE library expects the function to
823d17cd367Smrgpass the message to the client via a callback.
824d17cd367SmrgFor example, if this is a Session Management "Save Yourself" message,
825d17cd367Smrgthis function should notify the client of the "Save Yourself" via a callback.
826d17cd367SmrgThe details of how such a callback would be defined
827d17cd367Smrgare implementation-dependent.</para>
828d17cd367Smrg
829d17cd367Smrg<para>However, if reply_wait is not NULL ,
830d17cd367Smrgthen the client is waiting for
831d17cd367Smrga reply or an error for a message it previously sent.
832d17cd367SmrgThe reply_wait is of type
833d17cd367Smrg<function>IceReplyWaitInfo</function></para>
834d17cd367Smrg
835d17cd367Smrg
836d17cd367Smrg<literallayout remap='Ds'>
837d17cd367Smrgtypedef struct {
838d17cd367Smrg	unsigned long sequence_of_request;
839d17cd367Smrg	int major_opcode_of_request;
840d17cd367Smrg	int minor_opcode_of_request;
841d17cd367Smrg	IcePointer reply;
842d17cd367Smrg} IceReplyWaitInfo;
843d17cd367Smrg</literallayout>
844d17cd367Smrg
845d17cd367Smrg<para><function>IceReplyWaitInfo</function>
846d17cd367Smrgcontains the major/minor opcodes and sequence number of
847d17cd367Smrgthe message for which a reply is being awaited.
848d17cd367SmrgIt also contains a pointer to the reply message to be filled in
849d17cd367Smrg(the protocol library should cast this
850d17cd367Smrg<function>IcePointer</function>
851d17cd367Smrgto the appropriate reply type).
852d17cd367SmrgIn most cases, the reply will have some fixed-size part, and the client waiting
853d17cd367Smrgfor the reply will have provided a pointer to a structure to hold
854d17cd367Smrgthis fixed-size data.  If there is variable-length data, it would be
855d17cd367Smrgexpected that the
856d17cd367Smrg<function>IcePoProcessMsgProc</function>
857d17cd367Smrgcallback will have to allocate additional
858d17cd367Smrgmemory and store pointer(s) to that memory in the fixed-size
859d17cd367Smrgstructure.  If the entire data is variable length (for example., a single
860d17cd367Smrgvariable-length string), then the client waiting for the reply would probably
861d17cd367Smrgjust pass a pointer to fixed-size space to hold a pointer, and the
862d17cd367Smrg<function>IcePoProcessMsgProc</function>
863d17cd367Smrgcallback would allocate the storage and store the pointer.
864d17cd367SmrgIt is the responsibility of the client receiving the reply to
865d17cd367Smrgfree any memory allocated on its behalf.</para>
866d17cd367Smrg
867d17cd367Smrg<para>If reply_wait is not NULL and
868d17cd367Smrg<function>IcePoProcessMsgProc</function>
869d17cd367Smrghas a reply or error to return in response to this reply_wait
870d17cd367Smrg(that is, no callback was generated), then the reply_ready_ret argument
871d17cd367Smrgshould be set to
872d17cd367Smrg<function>True</function>
873d17cd367SmrgNote that an error should only be returned
874d17cd367Smrgif it corresponds to the reply being waited for.  Otherwise, the
875d17cd367Smrg<function>IcePoProcessMsgProc</function>
876d17cd367Smrgshould either handle the error internally or invoke an error handler
877d17cd367Smrgfor its library.</para>
878d17cd367Smrg
879d17cd367Smrg<para>If reply_wait is NULL,
880d17cd367Smrgthen care must be taken not to store any value in reply_ready_ret,
881d17cd367Smrgbecause this pointer may also be NULL.</para>
882d17cd367Smrg
883d17cd367Smrg<para>The
884d17cd367Smrg<function>IcePaProcessMsgProc</function>
885d17cd367Smrgcallback, on the other hand, should always pass
886d17cd367Smrgthe message to the client via a callback.  For example, if this is a Session
887d17cd367SmrgManagement "Interact Request" message, this function should notify the
888d17cd367Smrgclient of the "Interact Request" via a callback.</para>
889d17cd367Smrg
890d17cd367Smrg<para>The reason the
891d17cd367Smrg<function>IcePaProcessMsgProc</function>
892d17cd367Smrgcallback does not have a reply_wait, like
893d17cd367Smrg<function>IcePoProcessMsgProc</function>
894d17cd367Smrgdoes, is because a process that is acting as
895d17cd367Smrga server should never block for a reply (infinite blocking can
896d17cd367Smrgoccur if the connecting client does not act properly, denying access
897d17cd367Smrgto other clients).</para>
898d17cd367Smrg</sect1>
899d17cd367Smrg
900d17cd367Smrg<sect1 id='authentication_methods'>
901d17cd367Smrg<title>Authentication Methods</title>
902d17cd367Smrg
903d17cd367Smrg<para>As already stated, a protocol library must register the authentication
904d17cd367Smrgmethods that it supports with the ICE library.  For each authentication
905d17cd367Smrgmethod, there are two callbacks that may be registered:</para>
906d17cd367Smrg<itemizedlist>
907d17cd367Smrg  <listitem>
908d17cd367Smrg    <para>
909d17cd367SmrgOne to handle the side that initiates a <function>ProtocolSetup</function>
910d17cd367Smrg    </para>
911d17cd367Smrg  </listitem>
912d17cd367Smrg  <listitem>
913d17cd367Smrg    <para>
914d17cd367SmrgOne to handle the side that accepts or rejects this request
915d17cd367Smrg    </para>
916d17cd367Smrg  </listitem>
917d17cd367Smrg</itemizedlist>
918d17cd367Smrg
919d17cd367Smrg<para><function>IcePoAuthProc</function>
920d17cd367Smrgis the callback invoked for the client that initiated the
921d17cd367Smrg<function>ProtocolSetup</function>
922d17cd367SmrgThis callback must be able to respond
923d17cd367Smrgto the initial "Authentication Required" message or subsequent
924d17cd367Smrg"Authentication Next Phase" messages sent by the other client.</para>
925d17cd367Smrg
926d17cd367Smrg
927d17cd367Smrg<funcsynopsis>
928d17cd367Smrg<funcprototype>
929d17cd367Smrg  <funcdef>IcePoAuthStatus <function>IcePoAuthStatus </function></funcdef>
930d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
931d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
932d17cd367Smrg    <paramdef>int<parameter> opcode</parameter></paramdef>
933d17cd367Smrg</funcprototype>
934d17cd367Smrg</funcsynopsis>
935d17cd367Smrg
936d17cd367Smrg
937d17cd367Smrg<variablelist remap='IP'>
938d17cd367Smrg  <varlistentry>
939d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
940d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
941d17cd367Smrg  </varlistentry>
942d17cd367Smrg  <varlistentry>
943d17cd367Smrg  <term><emphasis remap='I'>auth_state_ptr</emphasis></term>
944d17cd367Smrg  <listitem>
945d17cd367Smrg<para>A pointer to state for use by the authentication callback procedure.</para>
946d17cd367Smrg  </listitem>
947d17cd367Smrg  </varlistentry>
948d17cd367Smrg  <varlistentry>
949d17cd367Smrg  <term><emphasis remap='I'>clean_up</emphasis></term>
950d17cd367Smrg  <listitem>
951d17cd367Smrg<para>If
952d17cd367Smrg<function>True</function>
953d17cd367Smrgauthentication is over, and the function
954d17cd367Smrgshould clean up any state it was maintaining.  The
955d17cd367Smrglast 6 arguments should be ignored.</para>
956d17cd367Smrg  </listitem>
957d17cd367Smrg  </varlistentry>
958d17cd367Smrg  <varlistentry>
959d17cd367Smrg  <term><emphasis remap='I'>swap</emphasis></term>
960d17cd367Smrg  <listitem>
961d17cd367Smrg<para>If
962d17cd367Smrg<function>True</function>
963d17cd367Smrgthe auth_data may have to be byte swapped
964d17cd367Smrg(depending on its contents).</para>
965d17cd367Smrg  </listitem>
966d17cd367Smrg  </varlistentry>
967d17cd367Smrg  <varlistentry>
968d17cd367Smrg  <term><emphasis remap='I'>auth_datalen</emphasis></term>
969d17cd367Smrg  <listitem>
970d17cd367Smrg<para>The length (in bytes) of the authenticator data.</para>
971d17cd367Smrg  </listitem>
972d17cd367Smrg  </varlistentry>
973d17cd367Smrg  <varlistentry>
974d17cd367Smrg  <term><emphasis remap='I'>auth_data</emphasis></term>
975d17cd367Smrg  <listitem>
976d17cd367Smrg<para>The data from the authenticator.</para>
977d17cd367Smrg  </listitem>
978d17cd367Smrg  </varlistentry>
979d17cd367Smrg  <varlistentry>
980d17cd367Smrg  <term><emphasis remap='I'>reply_datalen_ret</emphasis></term>
981d17cd367Smrg  <listitem>
982d17cd367Smrg<para>The length (in bytes) of the reply data returned.</para>
983d17cd367Smrg  </listitem>
984d17cd367Smrg  </varlistentry>
985d17cd367Smrg  <varlistentry>
986d17cd367Smrg  <term><emphasis remap='I'>reply_data_ret</emphasis></term>
987d17cd367Smrg  <listitem>
988d17cd367Smrg<para>The reply data returned.</para>
989d17cd367Smrg  </listitem>
990d17cd367Smrg  </varlistentry>
991d17cd367Smrg  <varlistentry>
992d17cd367Smrg  <term><emphasis remap='I'>error_string_ret</emphasis></term>
993d17cd367Smrg  <listitem>
994d17cd367Smrg<para>If the authentication procedure encounters an error during
995d17cd367Smrgauthentication, it should allocate and return
996d17cd367Smrgan error string.</para>
997d17cd367Smrg  </listitem>
998d17cd367Smrg  </varlistentry>
999d17cd367Smrg</variablelist>
1000d17cd367Smrg
1001d17cd367Smrg
1002d17cd367Smrg<para>Authentication may require several phases, depending on the authentication
1003d17cd367Smrgmethod.  As a result, the
1004d17cd367Smrg<function>IcePoAuthProc</function>
1005d17cd367Smrgmay be called more than once when authenticating a client, and
1006d17cd367Smrgsome state will have to be maintained between each invocation.
1007d17cd367SmrgAt the start of each
1008d17cd367Smrg<function>ProtocolSetup</function>
1009d17cd367Smrg*auth_state_ptr is NULL,
1010d17cd367Smrgand the function should initialize its state and set
1011d17cd367Smrgthis pointer.  In subsequent invocations of the callback, the pointer
1012d17cd367Smrgshould be used to get at any state previously stored by the callback.</para>
1013d17cd367Smrg
1014d17cd367Smrg<para>If needed, the network ID of the client accepting the
1015d17cd367Smrg<function>ProtocolSetup</function>
1016d17cd367Smrgcan be obtained by calling the
1017d17cd367Smrg<function>IceConnectionString</function>
1018d17cd367Smrgfunction.</para>
1019d17cd367Smrg
1020d17cd367Smrg<para>ICElib will be responsible for freeing the reply_data_ret and
1021d17cd367Smrgerror_string_ret pointers with
1022d17cd367Smrg<function>free</function></para>
1023d17cd367Smrg
1024d17cd367Smrg<para>The auth_data pointer may point to a volatile block of memory.
1025d17cd367SmrgIf the data must be kept beyond this invocation of the callback, be sure
1026d17cd367Smrgto make a copy of it.</para>
1027d17cd367Smrg
1028d17cd367Smrg<para>The
1029d17cd367Smrg<function>IcePoAuthProc</function>
1030d17cd367Smrgshould return one of four values:</para>
1031d17cd367Smrg<itemizedlist>
1032d17cd367Smrg  <listitem>
1033d17cd367Smrg<para><function>IcePoAuthHaveReply</function>
1034d17cd367Smrg- a reply is available.</para>
1035d17cd367Smrg  </listitem>
1036d17cd367Smrg  <listitem>
1037d17cd367Smrg<para><function>IcePoAuthRejected</function>
1038d17cd367Smrg- authentication rejected.</para>
1039d17cd367Smrg  </listitem>
1040d17cd367Smrg  <listitem>
1041d17cd367Smrg<para><function>IcePoAuthFailed</function>
1042d17cd367Smrg- authentication failed.</para>
1043d17cd367Smrg  </listitem>
1044d17cd367Smrg  <listitem>
1045d17cd367Smrg<para><function>IcePoAuthDoneCleanup</function>
1046d17cd367Smrg- done cleaning up.</para>
1047d17cd367Smrg  </listitem>
1048d17cd367Smrg</itemizedlist>
1049d17cd367Smrg
1050d17cd367Smrg<para><function>IcePaAuthProc</function>
1051d17cd367Smrgis the callback invoked for the client that received the
1052d17cd367Smrg<function>ProtocolSetup</function></para>
1053d17cd367Smrg
1054d17cd367Smrg<funcsynopsis>
1055d17cd367Smrg<funcprototype>
1056d17cd367Smrg  <funcdef>IcePoAuthStatus <function>PoAuthStatus </function></funcdef>
1057d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
1058d17cd367Smrg    <paramdef>IcePointer<parameter> *auth_state_ptr</parameter></paramdef>
1059d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
1060d17cd367Smrg    <paramdef>int<parameter> auth_datalen</parameter></paramdef>
1061d17cd367Smrg    <paramdef>IcePointer<parameter> auth_data</parameter></paramdef>
1062d17cd367Smrg    <paramdef>int<parameter> *reply_datalen_ret</parameter></paramdef>
1063d17cd367Smrg    <paramdef>IcePointer<parameter> *reply_data_ret</parameter></paramdef>
1064d17cd367Smrg    <paramdef>char<parameter> **error_string_ret</parameter></paramdef>
1065d17cd367Smrg</funcprototype>
1066d17cd367Smrg</funcsynopsis>
1067d17cd367Smrg
1068d17cd367Smrg<variablelist remap='IP'>
1069d17cd367Smrg  <varlistentry>
1070d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
1071d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
1072d17cd367Smrg  </varlistentry>
1073d17cd367Smrg  <varlistentry>
1074d17cd367Smrg    <term><emphasis remap='I'>auth_state_ptr</emphasis></term>
1075d17cd367Smrg    <listitem>
1076d17cd367Smrg<para>A pointer to state for use by the authentication callback procedure.</para>
1077d17cd367Smrg    </listitem>
1078d17cd367Smrg  </varlistentry>
1079d17cd367Smrg  <varlistentry>
1080d17cd367Smrg    <term><emphasis remap='I'>swap</emphasis></term>
1081d17cd367Smrg    <listitem>
1082d17cd367Smrg<para>If
1083d17cd367Smrg<function>True</function>
1084d17cd367Smrgauth_data may have to be byte swapped
1085d17cd367Smrg(depending on its contents).</para>
1086d17cd367Smrg    </listitem>
1087d17cd367Smrg  </varlistentry>
1088d17cd367Smrg  <varlistentry>
1089d17cd367Smrg    <term><emphasis remap='I'>auth_datalen</emphasis></term>
1090d17cd367Smrg    <listitem>
1091d17cd367Smrg<para>The length (in bytes) of the protocol originator authentication data.</para>
1092d17cd367Smrg    </listitem>
1093d17cd367Smrg  </varlistentry>
1094d17cd367Smrg  <varlistentry>
1095d17cd367Smrg    <term><emphasis remap='I'>auth_data</emphasis></term>
1096d17cd367Smrg    <listitem>
1097d17cd367Smrg<para>The authentication data from the protocol originator.</para>
1098d17cd367Smrg    </listitem>
1099d17cd367Smrg  </varlistentry>
1100d17cd367Smrg  <varlistentry>
1101d17cd367Smrg    <term><emphasis remap='I'>reply_datalen_ret</emphasis></term>
1102d17cd367Smrg    <listitem>
1103d17cd367Smrg<para>The length of the authentication data returned.</para>
1104d17cd367Smrg    </listitem>
1105d17cd367Smrg  </varlistentry>
1106d17cd367Smrg  <varlistentry>
1107d17cd367Smrg    <term><emphasis remap='I'>reply_data_ret</emphasis></term>
1108d17cd367Smrg    <listitem>
1109d17cd367Smrg<para>The authentication data returned.</para>
1110d17cd367Smrg    </listitem>
1111d17cd367Smrg  </varlistentry>
1112d17cd367Smrg  <varlistentry>
1113d17cd367Smrg    <term><emphasis remap='I'>error_string_ret</emphasis></term>
1114d17cd367Smrg    <listitem>
1115d17cd367Smrg<para>If authentication is rejected or fails, an error
1116d17cd367Smrgstring is returned.</para>
1117d17cd367Smrg    </listitem>
1118d17cd367Smrg  </varlistentry>
1119d17cd367Smrg</variablelist>
1120d17cd367Smrg
1121d17cd367Smrg
1122d17cd367Smrg<para>Authentication may require several phases, depending on the authentication
1123d17cd367Smrgmethod.  As a result, the
1124d17cd367Smrg<function>IcePaAuthProc</function>
1125d17cd367Smrgmay be called more than once when authenticating a client, and
1126d17cd367Smrgsome state will have to be maintained between each invocation.
1127d17cd367SmrgAt the start of each
1128d17cd367Smrg<function>ProtocolSetup</function>
1129d17cd367Smrgauth_datalen is zero,
1130d17cd367Smrg*auth_state_ptr is NULL,
1131d17cd367Smrgand the function should initialize its state and set
1132d17cd367Smrgthis pointer.  In subsequent invocations of the callback, the pointer
1133d17cd367Smrgshould be used to get at any state previously stored by the callback.</para>
1134d17cd367Smrg
1135d17cd367Smrg<para>If needed, the network ID of the client accepting the
1136d17cd367Smrg<function>ProtocolSetup</function>
1137d17cd367Smrgcan be obtained by calling the
1138d17cd367Smrg<function>IceConnectionString</function>
1139d17cd367Smrgfunction.</para>
1140d17cd367Smrg
1141d17cd367Smrg<para>The auth_data pointer may point to a volatile block of memory.
1142d17cd367SmrgIf the data must be kept beyond this invocation of the callback, be sure
1143d17cd367Smrgto make a copy of it.</para>
1144d17cd367Smrg
1145d17cd367Smrg<para>ICElib will be responsible for transmitting and freeing the reply_data_ret and
1146d17cd367Smrgerror_string_ret pointers with
1147d17cd367Smrg<function>free</function></para>
1148d17cd367Smrg
1149d17cd367Smrg<para>
1150d17cd367SmrgThe <function>IcePaAuthProc</function> should return one of four values:
1151d17cd367Smrg</para>
1152d17cd367Smrg
1153d17cd367Smrg
1154d17cd367Smrg<itemizedlist>
1155d17cd367Smrg  <listitem>
1156d17cd367Smrg    <para>
1157d17cd367Smrg<function>IcePaAuthContinue</function> - continue (or start) authentication.
1158d17cd367Smrg    </para>
1159d17cd367Smrg  </listitem>
1160d17cd367Smrg  <listitem>
1161d17cd367Smrg    <para>
1162d17cd367Smrg<function>IcePaAuthAccepted</function> - authentication accepted.
1163d17cd367Smrg    </para>
1164d17cd367Smrg  </listitem>
1165d17cd367Smrg  <listitem>
1166d17cd367Smrg    <para>
1167d17cd367Smrg<function>IcePaAuthRejected</function> - authentication rejected.
1168d17cd367Smrg    </para>
1169d17cd367Smrg  </listitem>
1170d17cd367Smrg  <listitem>
1171d17cd367Smrg    <para>
1172d17cd367Smrg<function>IcePaAuthFailed</function> - authentication failed.
1173d17cd367Smrg    </para>
1174d17cd367Smrg  </listitem>
1175d17cd367Smrg</itemizedlist>
1176d17cd367Smrg</sect1>
1177d17cd367Smrg
1178d17cd367Smrg</chapter>
1179d17cd367Smrg
1180d17cd367Smrg<chapter id='ice_connections'>
1181d17cd367Smrg<title>ICE Connections</title>
1182d17cd367Smrg
1183d17cd367Smrg<para>
1184d17cd367SmrgIn order for two clients to establish an ICE connection, one client has to be
1185d17cd367Smrgwaiting for connections, and the other client has to initiate the connection.
1186d17cd367SmrgMost clients will initiate connections, so we discuss that first.
1187d17cd367Smrg</para>
1188d17cd367Smrg
1189d17cd367Smrg<sect1 id='opening_an_ice_connection'>
1190d17cd367Smrg<title>Opening an ICE Connection</title>
1191d17cd367Smrg
1192d17cd367Smrg
1193d17cd367Smrg<para>
1194d17cd367SmrgTo open an ICE connection with another client (that is, waiting
1195d17cd367Smrgfor connections), use <function>IceOpenConnection</function>
1196d17cd367Smrg</para>
1197d17cd367Smrg
1198d17cd367Smrg<funcsynopsis>
1199d17cd367Smrg<funcprototype>
1200d17cd367Smrg  <funcdef>IceConn <function>IceOpenConnection</function></funcdef>
1201d17cd367Smrg    <paramdef>char<parameter> *network_ids_list</parameter></paramdef>
1202d17cd367Smrg    <paramdef>IcePointer<parameter> context</parameter></paramdef>
1203d17cd367Smrg    <paramdef>Bool<parameter> must_authenticate</parameter></paramdef>
1204d17cd367Smrg    <paramdef>int<parameter> major_opcode_check</parameter></paramdef>
1205d17cd367Smrg    <paramdef>int<parameter> error_length</parameter></paramdef>
1206d17cd367Smrg    <paramdef>char<parameter> *error_string_ret</parameter></paramdef>
1207d17cd367Smrg</funcprototype>
1208d17cd367Smrg</funcsynopsis>
1209d17cd367Smrg
1210d17cd367Smrg<variablelist remap='IP'>
1211d17cd367Smrg  <varlistentry>
1212d17cd367Smrg    <term><emphasis remap='I'>network_ids_list</emphasis></term>
1213d17cd367Smrg    <listitem>
1214d17cd367Smrg      <para>
1215d17cd367SmrgSpecifies the network ID(s) of the other client.
1216d17cd367Smrg      </para>
1217d17cd367Smrg    </listitem>
1218d17cd367Smrg  </varlistentry>
1219d17cd367Smrg  <varlistentry>
1220d17cd367Smrg    <term><emphasis remap='I'>context</emphasis></term>
1221d17cd367Smrg    <listitem>
1222d17cd367Smrg      <para>
1223d17cd367SmrgA pointer to an opaque object or NULL.  Used to determine if an
1224d17cd367SmrgICE connection can be shared (see below).
1225d17cd367Smrg      </para>
1226d17cd367Smrg    </listitem>
1227d17cd367Smrg  </varlistentry>
1228d17cd367Smrg  <varlistentry>
1229d17cd367Smrg    <term><emphasis remap='I'>must_authenticate</emphasis></term>
1230d17cd367Smrg    <listitem>
1231d17cd367Smrg      <para>
1232d17cd367SmrgIf <function>True</function> the other client may not bypass authentication.
1233d17cd367Smrg      </para>
1234d17cd367Smrg    </listitem>
1235d17cd367Smrg  </varlistentry>
1236d17cd367Smrg  <varlistentry>
1237d17cd367Smrg    <term><emphasis remap='I'>major_opcode_check</emphasis></term>
1238d17cd367Smrg    <listitem>
1239d17cd367Smrg      <para>
1240d17cd367SmrgUsed to force a new ICE connection to be created (see below).
1241d17cd367Smrg      </para>
1242d17cd367Smrg    </listitem>
1243d17cd367Smrg  </varlistentry>
1244d17cd367Smrg  <varlistentry>
1245d17cd367Smrg    <term><emphasis remap='I'>error_length</emphasis></term>
1246d17cd367Smrg    <listitem>
1247d17cd367Smrg      <para>Length of the error_string_ret argument passed in.</para>
1248d17cd367Smrg    </listitem>
1249d17cd367Smrg  </varlistentry>
1250d17cd367Smrg  <varlistentry>
1251d17cd367Smrg    <term><emphasis remap='I'>error_string_ret</emphasis></term>
1252d17cd367Smrg    <listitem>
1253d17cd367Smrg      <para>
1254d17cd367SmrgReturns a null-terminated error message, if any.  The error_string_ret
1255d17cd367Smrgargument points to user supplied memory.  No more than error_length bytes
1256d17cd367Smrgare used.
1257d17cd367Smrg      </para>
1258d17cd367Smrg    </listitem>
1259d17cd367Smrg  </varlistentry>
1260d17cd367Smrg</variablelist>
1261d17cd367Smrg
1262d17cd367Smrg
1263d17cd367Smrg<para>
1264d17cd367Smrg<function>IceOpenConnection</function>
1265d17cd367Smrgreturns an opaque ICE connection object if it succeeds;
1266d17cd367Smrgotherwise, it returns NULL.
1267d17cd367Smrg</para>
1268d17cd367Smrg
1269d17cd367Smrg<para>
1270d17cd367SmrgThe network_ids_list argument contains a list of network IDs separated
1271d17cd367Smrgby commas.  An attempt will be made to use the first network ID.  If
1272d17cd367Smrgthat fails, an attempt will be made using the second network ID, and so on.
1273d17cd367SmrgEach network ID has the following format:
1274d17cd367Smrg</para>
1275d17cd367Smrg
1276d17cd367Smrg<informaltable pgwide='0' frame='none'>
1277d17cd367Smrg  <tgroup cols='3' align='center'>
1278d17cd367Smrg    <colspec colname='c1'/>
1279d17cd367Smrg    <colspec colname='c2'/>
1280d17cd367Smrg    <colspec colname='c3'/>
1281d17cd367Smrg    <tbody>
1282d17cd367Smrg      <row>
1283d17cd367Smrg        <entry align='left'></entry>
1284d17cd367Smrg        <entry align='left'>tcp/&lt;hostname&gt;:&lt;portnumber&gt;</entry>
1285d17cd367Smrg        <entry align='left'>or</entry>
1286d17cd367Smrg      </row>
1287d17cd367Smrg      <row>
1288d17cd367Smrg        <entry align='left'></entry>
1289d17cd367Smrg        <entry align='left'>decnet/&lt;hostname&gt;::&lt;objname&gt;</entry>
1290d17cd367Smrg        <entry align='left'>or</entry>
1291d17cd367Smrg      </row>
1292d17cd367Smrg      <row>
1293d17cd367Smrg        <entry align='left'></entry>
1294d17cd367Smrg        <entry align='left'>local/&lt;hostname&gt;:&lt;path&gt;</entry>
1295d17cd367Smrg        <entry align='left'></entry>
1296d17cd367Smrg      </row>
1297d17cd367Smrg    </tbody>
1298d17cd367Smrg  </tgroup>
1299d17cd367Smrg</informaltable>
1300d17cd367Smrg
1301d17cd367Smrg
1302d17cd367Smrg<para>Most protocol libraries will have some sort of open function that should
1303d17cd367Smrginternally make a call into
1304d17cd367Smrg<function>IceOpenConnection</function>
1305d17cd367SmrgWhen
1306d17cd367Smrg<function>IceOpenConnection</function>
1307d17cd367Smrgis called, it may be possible to use a previously opened ICE connection (if
1308d17cd367Smrgthe target client is the same).  However, there are cases in which shared
1309d17cd367SmrgICE connections are not desired.</para>
1310d17cd367Smrg
1311d17cd367Smrg<para>The context argument is used to determine if an ICE connection can
1312d17cd367Smrgbe shared.
1313d17cd367SmrgIf context is NULL,
1314d17cd367Smrgthen the caller is always willing to share the connection.
1315d17cd367SmrgIf context is not NULL,
1316d17cd367Smrgthen the caller is not willing to use a previously opened ICE connection
1317d17cd367Smrgthat has a different non-NULL context associated with it.</para>
1318d17cd367Smrg
1319d17cd367Smrg<para>In addition, if major_opcode_check contains a nonzero major opcode value,
1320d17cd367Smrga previously created ICE connection will be used only if the major opcode
1321d17cd367Smrgis not active on the connection.  This can be used to force multiple ICE
1322d17cd367Smrgconnections between two clients for the same protocol.</para>
1323d17cd367Smrg
1324d17cd367Smrg<para>Any authentication requirements are handled internally by the ICE library.
1325d17cd367SmrgThe method by which the authentication data is obtained
1326d17cd367Smrgis implementation-dependent.
1327d17cd367Smrg  <footnote remap='FS'>
1328d17cd367Smrg<para>The X Consortium's ICElib implementation uses an .ICEauthority file (see
1329d17cd367SmrgAppendix A).
1330d17cd367Smrg  </para></footnote> </para>
1331d17cd367Smrg
1332d17cd367Smrg<para>After
1333d17cd367Smrg<function>IceOpenConnection</function>
1334d17cd367Smrgis called, the client is ready to send a
1335d17cd367Smrg<function>ProtocolSetup</function>
1336d17cd367Smrg(provided that
1337d17cd367Smrg<function>IceRegisterForProtocolSetup</function>
1338d17cd367Smrgwas called) or receive a
1339d17cd367Smrg<function>ProtocolSetup</function>
1340d17cd367Smrg(provided that
1341d17cd367Smrg<function>IceRegisterForProtocolReply</function>
1342d17cd367Smrgwas called).</para>
1343d17cd367Smrg</sect1>
1344d17cd367Smrg
1345d17cd367Smrg<sect1 id='listening_for_ice_connections'>
1346d17cd367Smrg<title>Listening for ICE Connections</title>
1347d17cd367Smrg
1348d17cd367Smrg<para>Clients wishing to accept ICE connections must first call
1349d17cd367Smrg<function>IceListenForConnections</function>
1350d17cd367Smrgor
1351d17cd367Smrg<function>IceListenForWellKnownConnections</function>
1352d17cd367Smrgso that they can listen for connections.  A list of opaque "listen" objects are
1353d17cd367Smrgreturned, one for each type of transport method that is available
1354d17cd367Smrg(for example, Unix Domain, TCP, DECnet, and so on).</para>
1355d17cd367Smrg
1356d17cd367Smrg<para>Normally clients will let ICElib allocate an available name in each
1357d17cd367Smrgtransport and return listen objects.  Such a client will then use
1358d17cd367Smrg<function>IceComposeNetworkIdList</function>
1359d17cd367Smrgto extract the chosen names and make them
1360d17cd367Smrgavailable to other clients for opening the connection.  In certain
1361d17cd367Smrgcases it may be necessary for a client to listen for connections
1362d17cd367Smrgon pre-arranged transport object names.  Such a client may use
1363d17cd367Smrg<function>IceListenForWellKnownConnections</function>
1364d17cd367Smrgto specify the names for the listen objects.</para>
1365d17cd367Smrg
1366d17cd367Smrg<funcsynopsis>
1367d17cd367Smrg<funcprototype>
1368d17cd367Smrg  <funcdef>Status <function>IceListenForConnections</function></funcdef>
1369d17cd367Smrg    <paramdef>int<parameter> *count_ret</parameter></paramdef>
1370d17cd367Smrg    <paramdef>IceListenObj<parameter> **listen_objs_ret</parameter></paramdef>
1371d17cd367Smrg    <paramdef>int<parameter> error_length</parameter></paramdef>
1372d17cd367Smrg    <paramdef>char<parameter> *error_string_ret</parameter></paramdef>
1373d17cd367Smrg</funcprototype>
1374d17cd367Smrg</funcsynopsis>
1375d17cd367Smrg
1376d17cd367Smrg<variablelist remap='IP'>
1377d17cd367Smrg  <varlistentry>
1378d17cd367Smrg    <term><emphasis remap='I'>count_ret</emphasis></term>
1379d17cd367Smrg    <listitem><para>Returns the number of listen objects created.</para></listitem>
1380d17cd367Smrg  </varlistentry>
1381d17cd367Smrg  <varlistentry>
1382d17cd367Smrg    <term><emphasis remap='I'>listen_objs_ret</emphasis></term>
1383d17cd367Smrg    <listitem><para>Returns a list of pointers to opaque listen objects.</para></listitem>
1384d17cd367Smrg  </varlistentry>
1385d17cd367Smrg  <varlistentry>
1386d17cd367Smrg  <term><emphasis remap='I'>error_length</emphasis></term>
1387d17cd367Smrg  <listitem>
1388d17cd367Smrg<para>The length of the error_string_ret argument passed in.</para>
1389d17cd367Smrg  </listitem>
1390d17cd367Smrg  </varlistentry>
1391d17cd367Smrg  <varlistentry>
1392d17cd367Smrg  <term><emphasis remap='I'>error_string_ret</emphasis></term>
1393d17cd367Smrg  <listitem>
1394d17cd367Smrg<para>Returns a null-terminated error message, if any.
1395d17cd367SmrgThe error_string_ret points to user supplied memory.
1396d17cd367SmrgNo more than error_length bytes are used.</para>
1397d17cd367Smrg  </listitem>
1398d17cd367Smrg  </varlistentry>
1399d17cd367Smrg</variablelist>
1400d17cd367Smrg
1401d17cd367Smrg
1402d17cd367Smrg<para>The return value of
1403d17cd367Smrg<function>IceListenForConnections</function>
1404d17cd367Smrgis zero for failure and a positive value for success.</para>
1405d17cd367Smrg
1406d17cd367Smrg<funcsynopsis>
1407d17cd367Smrg<funcprototype>
1408d17cd367Smrg  <funcdef>Status <function>IceListenForWellKnownConnections</function></funcdef>
1409d17cd367Smrg    <paramdef>char<parameter> *port_id</parameter></paramdef>
1410d17cd367Smrg    <paramdef>int<parameter> *count_ret</parameter></paramdef>
1411d17cd367Smrg    <paramdef>IceListenObj<parameter> **listen_objs_ret</parameter></paramdef>
1412d17cd367Smrg    <paramdef>int<parameter> error_length</parameter></paramdef>
1413d17cd367Smrg    <paramdef>char<parameter> *error_string_ret</parameter></paramdef>
1414d17cd367Smrg</funcprototype>
1415d17cd367Smrg</funcsynopsis>
1416d17cd367Smrg
1417d17cd367Smrg<variablelist remap='IP'>
1418d17cd367Smrg  <varlistentry>
1419d17cd367Smrg    <term><emphasis remap='I'>port_id</emphasis></term>
1420d17cd367Smrg    <listitem>
1421d17cd367Smrg      <para>
1422d17cd367SmrgSpecifies the port identification for the address(es) to be opened.  The
1423d17cd367Smrgvalue must not contain the slash ("/"> or comma (".") character; thse are
1424d17cd367Smrgreserved for future use.
1425d17cd367Smrg      </para>
1426d17cd367Smrg    </listitem>
1427d17cd367Smrg  </varlistentry>
1428d17cd367Smrg  <varlistentry>
1429d17cd367Smrg    <term><emphasis remap='I'>count_ret</emphasis></term>
1430d17cd367Smrg    <listitem>
1431d17cd367Smrg      <para>Returns the number of listen objects created.</para>
1432d17cd367Smrg    </listitem>
1433d17cd367Smrg  </varlistentry>
1434d17cd367Smrg  <varlistentry>
1435d17cd367Smrg    <term><emphasis remap='I'>listen_objs_ret</emphasis></term>
1436d17cd367Smrg    <listitem>
1437d17cd367Smrg      <para>
1438d17cd367SmrgReturns a list of pointers to opaque listen objects.
1439d17cd367Smrg      </para>
1440d17cd367Smrg    </listitem>
1441d17cd367Smrg  </varlistentry>
1442d17cd367Smrg  <varlistentry>
1443d17cd367Smrg    <term><emphasis remap='I'>listen_objs_ret</emphasis></term>
1444d17cd367Smrg    <listitem>
1445d17cd367Smrg      <para>
1446d17cd367SmrgReturns a list of pointers to opaque listen objects.
1447d17cd367Smrg      </para>
1448d17cd367Smrg    </listitem>
1449d17cd367Smrg  </varlistentry>
1450d17cd367Smrg  <varlistentry>
1451d17cd367Smrg    <term><emphasis remap='I'>error_length</emphasis></term>
1452d17cd367Smrg    <listitem>
1453d17cd367Smrg      <para>
1454d17cd367SmrgThe length of the error_string_ret argument passed in.
1455d17cd367Smrg      </para>
1456d17cd367Smrg    </listitem>
1457d17cd367Smrg  </varlistentry>
1458d17cd367Smrg  <varlistentry>
1459d17cd367Smrg    <term><emphasis remap='I'>error_string_ret</emphasis></term>
1460d17cd367Smrg    <listitem>
1461d17cd367Smrg      <para>
1462d17cd367SmrgReturns a null-terminated error message, if any.  The error_string_ret
1463d17cd367Smrgpoints to user supplied memory.  No more than error_length bytes are used.
1464d17cd367Smrg      </para>
1465d17cd367Smrg    </listitem>
1466d17cd367Smrg  </varlistentry>
1467d17cd367Smrg</variablelist>
1468d17cd367Smrg
1469d17cd367Smrg<para>
1470d17cd367Smrg<function>IceListenForWellKnownConnections</function> constructs a list
1471d17cd367Smrgof network IDs by prepending each known transport to port_id and then
1472d17cd367Smrgattempts to create listen objects for the result.  Port_id is the portnumber,
1473d17cd367Smrgobjname, or path portion of the ICE network ID. If a listen object for
1474d17cd367Smrga particular network ID cannot be created the network ID is ignored.
1475d17cd367SmrgIf no listen objects are created
1476d17cd367Smrg<function>IceListenForWellKnownConnections</function>
1477d17cd367Smrgreturns failure.
1478d17cd367Smrg</para>
1479d17cd367Smrg
1480d17cd367Smrg<para>
1481d17cd367SmrgThe return value of <function>IceListenForWellKnownConnections</function>
1482d17cd367Smrgis zero for failure and a positive value for success.
1483d17cd367Smrg</para>
1484d17cd367Smrg
1485d17cd367Smrg<para>
1486d17cd367SmrgTo close and free the listen objects, use
1487d17cd367Smrg<function>IceFreeListenObjs</function>
1488d17cd367Smrg</para>
1489d17cd367Smrg
1490d17cd367Smrg<funcsynopsis>
1491d17cd367Smrg<funcprototype>
1492d17cd367Smrg  <funcdef>void <function>IceFreeListenObjs</function></funcdef>
1493d17cd367Smrg    <paramdef>int<parameter> count</parameter></paramdef>
1494d17cd367Smrg    <paramdef>IceListenObj<parameter> *listen_objs</parameter></paramdef>
1495d17cd367Smrg</funcprototype>
1496d17cd367Smrg</funcsynopsis>
1497d17cd367Smrg
1498d17cd367Smrg<variablelist remap='IP'>
1499d17cd367Smrg  <varlistentry>
1500d17cd367Smrg    <term><emphasis remap='I'>count</emphasis></term>
1501d17cd367Smrg    <listitem>
1502d17cd367Smrg      <para>The number of listen objects.</para>
1503d17cd367Smrg    </listitem>
1504d17cd367Smrg  </varlistentry>
1505d17cd367Smrg  <varlistentry>
1506d17cd367Smrg    <term><emphasis remap='I'>listen_objs</emphasis></term>
1507d17cd367Smrg    <listitem>
1508d17cd367Smrg      <para>The listen objects.</para>
1509d17cd367Smrg    </listitem>
1510d17cd367Smrg  </varlistentry>
1511d17cd367Smrg</variablelist>
1512d17cd367Smrg
1513d17cd367Smrg
1514d17cd367Smrg<para>
1515d17cd367SmrgTo detect a new connection on a listen object, use
1516d17cd367Smrg<function>select</function> on the descriptor associated with
1517d17cd367Smrgthe listen object.
1518d17cd367Smrg</para>
1519d17cd367Smrg
1520d17cd367Smrg<para>
1521d17cd367SmrgTo obtain the descriptor, use
1522d17cd367Smrg<function>IceGetListenConnectionNumber</function>
1523d17cd367Smrg</para>
1524d17cd367Smrg
1525d17cd367Smrg<funcsynopsis>
1526d17cd367Smrg<funcprototype>
1527d17cd367Smrg  <funcdef>int <function>IceGetListenConnectionNumber</function></funcdef>
1528d17cd367Smrg    <paramdef>IceListenObj<parameter> *listen_objs</parameter></paramdef>
1529d17cd367Smrg</funcprototype>
1530d17cd367Smrg</funcsynopsis>
1531d17cd367Smrg
1532d17cd367Smrg<variablelist remap='IP'>
1533d17cd367Smrg  <varlistentry>
1534d17cd367Smrg  <term><emphasis remap='I'>listen_obj</emphasis></term>
1535d17cd367Smrg    <listitem>
1536d17cd367Smrg      <para>The listen objects.</para>
1537d17cd367Smrg    </listitem>
1538d17cd367Smrg  </varlistentry>
1539d17cd367Smrg</variablelist>
1540d17cd367Smrg
1541d17cd367Smrg<para>
1542d17cd367SmrgTo obtain the network ID string associated with a listen object, use
1543d17cd367Smrg<function>IceGetListenConnectionString</function>
1544d17cd367Smrg</para>
1545d17cd367Smrg
1546d17cd367Smrg
1547d17cd367Smrg<funcsynopsis>
1548d17cd367Smrg<funcprototype>
1549d17cd367Smrg  <funcdef>char <function>IceGetListenConnectionString</function></funcdef>
1550d17cd367Smrg    <paramdef>IceListenObj<parameter> listen_obj</parameter></paramdef>
1551d17cd367Smrg</funcprototype>
1552d17cd367Smrg</funcsynopsis>
1553d17cd367Smrg
1554d17cd367Smrg<variablelist remap='IP'>
1555d17cd367Smrg  <varlistentry>
1556d17cd367Smrg    <term><emphasis remap='I'>listen_obj</emphasis></term>
1557d17cd367Smrg    <listitem>
1558d17cd367Smrg      <para>The listen objects.</para>
1559d17cd367Smrg    </listitem>
1560d17cd367Smrg  </varlistentry>
1561d17cd367Smrg</variablelist>
1562d17cd367Smrg
1563d17cd367Smrg<para>A network ID has the following format:</para>
1564d17cd367Smrg
1565d17cd367Smrg<informaltable pgwide='0' frame='none'>
1566d17cd367Smrg  <tgroup cols='3' align='center'>
1567d17cd367Smrg    <colspec colname='c1'/>
1568d17cd367Smrg    <colspec colname='c2'/>
1569d17cd367Smrg    <colspec colname='c3'/>
1570d17cd367Smrg    <tbody>
1571d17cd367Smrg      <row>
1572d17cd367Smrg        <entry align='left'></entry>
1573d17cd367Smrg        <entry align='left'>tcp/&lt;hostname&gt;:&lt;portnumber&gt;</entry>
1574d17cd367Smrg        <entry align='left'>or</entry>
1575d17cd367Smrg      </row>
1576d17cd367Smrg      <row>
1577d17cd367Smrg        <entry align='left'></entry>
1578d17cd367Smrg        <entry align='left'>decnet/&lt;hostname&gt;::&lt;objname&gt;</entry>
1579d17cd367Smrg        <entry align='left'>or</entry>
1580d17cd367Smrg      </row>
1581d17cd367Smrg      <row>
1582d17cd367Smrg        <entry align='left'></entry>
1583d17cd367Smrg        <entry align='left'>local/&lt;hostname&gt;:&lt;path&gt;</entry>
1584d17cd367Smrg        <entry align='left'></entry>
1585d17cd367Smrg      </row>
1586d17cd367Smrg    </tbody>
1587d17cd367Smrg  </tgroup>
1588d17cd367Smrg</informaltable>
1589d17cd367Smrg
1590d17cd367Smrg<para>
1591d17cd367SmrgTo compose a string containing a list of network IDs separated by commas
1592d17cd367Smrg(the format recognized by <function>IceOpenConnection</function>
1593d17cd367Smrguse <function>IceComposeNetworkIdList</function>
1594d17cd367Smrg</para>
1595d17cd367Smrg
1596d17cd367Smrg<funcsynopsis>
1597d17cd367Smrg<funcprototype>
1598d17cd367Smrg  <funcdef>char <function>IceComposeNetworkIdList</function></funcdef>
1599d17cd367Smrg    <paramdef>int<parameter> count</parameter></paramdef>
1600d17cd367Smrg    <paramdef>IceListenObj<parameter> *listen_objs</parameter></paramdef>
1601d17cd367Smrg</funcprototype>
1602d17cd367Smrg</funcsynopsis>
1603d17cd367Smrg
1604d17cd367Smrg<variablelist remap='IP'>
1605d17cd367Smrg  <varlistentry>
1606d17cd367Smrg    <term><emphasis remap='I'>count</emphasis></term>
1607d17cd367Smrg    <listitem>
1608d17cd367Smrg      <para>The number of listen objects.</para>
1609d17cd367Smrg    </listitem>
1610d17cd367Smrg  </varlistentry>
1611d17cd367Smrg  <varlistentry>
1612d17cd367Smrg    <term><emphasis remap='I'>listen_objs</emphasis></term>
1613d17cd367Smrg    <listitem>
1614d17cd367Smrg      <para>The listen objects.</para>
1615d17cd367Smrg    </listitem>
1616d17cd367Smrg  </varlistentry>
1617d17cd367Smrg</variablelist>
1618d17cd367Smrg
1619d17cd367Smrg</sect1>
1620d17cd367Smrg
1621d17cd367Smrg<sect1 id='host_based_authentication_for_ice_connec'>
1622d17cd367Smrg<title>Host Based Authentication for ICE Connections</title>
1623d17cd367Smrg
1624d17cd367Smrg<para>
1625d17cd367SmrgIf authentication fails when a client attempts to open an
1626d17cd367SmrgICE connection and the initiating client has not required authentication,
1627d17cd367Smrga host based authentication procedure may be invoked to provide
1628d17cd367Smrga last chance for the client to connect.  Each listen object has such a
1629d17cd367Smrgcallback associated with it, and this callback is set using the
1630d17cd367Smrg<function>IceSetHostBasedAuthProc</function>
1631d17cd367Smrgfunction.
1632d17cd367Smrg</para>
1633d17cd367Smrg
1634d17cd367Smrg<funcsynopsis>
1635d17cd367Smrg<funcprototype>
1636d17cd367Smrg  <funcdef>void <function>IceSetHostBasedAuthProc</function></funcdef>
1637d17cd367Smrg    <paramdef>IceListenObj<parameter> listen_obj</parameter></paramdef>
1638d17cd367Smrg    <paramdef>IceHostBasedAuthProc<parameter> host_based_auth_proc</parameter></paramdef>
1639d17cd367Smrg</funcprototype>
1640d17cd367Smrg</funcsynopsis>
1641d17cd367Smrg
1642d17cd367Smrg<variablelist remap='IP'>
1643d17cd367Smrg  <varlistentry>
1644d17cd367Smrg    <term><emphasis remap='I'>IceListenObj</emphasis></term>
1645d17cd367Smrg    <listitem>
1646d17cd367Smrg      <para>The listen object.</para>
1647d17cd367Smrg    </listitem>
1648d17cd367Smrg  </varlistentry>
1649d17cd367Smrg  <varlistentry>
1650d17cd367Smrg    <term><emphasis remap='I'>host_based_auth_proc</emphasis></term>
1651d17cd367Smrg    <listitem>
1652d17cd367Smrg      <para>The host based authentication procedure.</para>
1653d17cd367Smrg    </listitem>
1654d17cd367Smrg  </varlistentry>
1655d17cd367Smrg</variablelist>
1656d17cd367Smrg
1657d17cd367Smrg
1658d17cd367Smrg<para>
1659d17cd367SmrgBy default, each listen object has no host based authentication procedure
1660d17cd367Smrgassociated with it.  Passing NULL for host_based_auth_proc turns off
1661d17cd367Smrghost based authentication if it was previously set.
1662d17cd367Smrg</para>
1663d17cd367Smrg
1664d17cd367Smrg
1665d17cd367Smrg<funcsynopsis>
1666d17cd367Smrg<funcprototype>
1667d17cd367Smrg  <funcdef>Bool <function>HostBasedAuthProc</function></funcdef>
1668d17cd367Smrg    <paramdef>char<parameter> *host_name</parameter></paramdef>
1669d17cd367Smrg</funcprototype>
1670d17cd367Smrg</funcsynopsis>
1671d17cd367Smrg
1672d17cd367Smrg<variablelist remap='IP'>
1673d17cd367Smrg  <varlistentry>
1674d17cd367Smrg    <term><emphasis remap='I'>host_name</emphasis></term>
1675d17cd367Smrg    <listitem>
1676d17cd367Smrg      <para>
1677d17cd367SmrgThe host name of the client that tried to open an ICE connection.
1678d17cd367Smrg      </para>
1679d17cd367Smrg    </listitem>
1680d17cd367Smrg  </varlistentry>
1681d17cd367Smrg</variablelist>
1682d17cd367Smrg
1683d17cd367Smrg
1684d17cd367Smrg<para>
1685d17cd367SmrgThe host_name argument is a string in the form
1686d17cd367Smrg<emphasis remap='I'>protocol</emphasis>/
1687d17cd367Smrg<emphasis remap='I'>hostname</emphasis>,
1688d17cd367Smrgwhere <emphasis remap='I'>protocol</emphasis> is one of
1689d17cd367Smrg{tcp, decnet, local}.
1690d17cd367Smrg</para>
1691d17cd367Smrg
1692d17cd367Smrg<para>
1693d17cd367SmrgIf <function>IceHostBasedAuthProc</function> returns
1694d17cd367Smrg<function>True</function>
1695d17cd367Smrgaccess will be granted, even though the original authentication failed.
1696d17cd367SmrgNote that authentication can effectively be disabled by registering an
1697d17cd367Smrg<function>IceHostBasedAuthProc</function>
1698d17cd367Smrgwhich always returns <function>True</function>
1699d17cd367Smrg</para>
1700d17cd367Smrg
1701d17cd367Smrg<para>
1702d17cd367SmrgHost based authentication is also allowed at
1703d17cd367Smrg<function>ProtocolSetup</function> time.
1704d17cd367SmrgThe callback is specified in the
1705d17cd367Smrg<function>IceRegisterForProtocolReply</function>
1706d17cd367Smrgfunction (see
1707d17cd367Smrg<link linkend="protocol_registration">
1708d17cd367Smrg<xref linkend="protocol_registration"></xref></link>).
1709d17cd367Smrg</para>
1710d17cd367Smrg</sect1>
1711d17cd367Smrg
1712d17cd367Smrg<sect1 id='accepting_ice_connections'>
1713d17cd367Smrg<title>Accepting ICE Connections</title>
1714d17cd367Smrg
1715d17cd367Smrg
1716d17cd367Smrg<para>
1717d17cd367SmrgAfter a connection attempt is detected on a listen object returned by
1718d17cd367Smrg<function>IceListenForConnections</function>
1719d17cd367Smrgyou should call <function>IceAcceptConnection</function>
1720d17cd367SmrgThis returns a new opaque ICE connection object.
1721d17cd367Smrg</para>
1722d17cd367Smrg
1723d17cd367Smrg<funcsynopsis>
1724d17cd367Smrg<funcprototype>
1725d17cd367Smrg  <funcdef>IceConn <function>IceAcceptConnection</function></funcdef>
1726d17cd367Smrg    <paramdef>IceListenObj<parameter> listen_obj</parameter></paramdef>
1727d17cd367Smrg    <paramdef>IceAcceptStatus<parameter> *status_ret</parameter></paramdef>
1728d17cd367Smrg</funcprototype>
1729d17cd367Smrg</funcsynopsis>
1730d17cd367Smrg
1731d17cd367Smrg
1732d17cd367Smrg<variablelist remap='IP'>
1733d17cd367Smrg  <varlistentry>
1734d17cd367Smrg  <term><emphasis remap='I'>listen_obj</emphasis></term>
1735d17cd367Smrg  <listitem>
1736d17cd367Smrg<para>The listen object on which a new connection was detected.</para>
1737d17cd367Smrg  </listitem>
1738d17cd367Smrg  </varlistentry>
1739d17cd367Smrg  </variablelist>
1740d17cd367Smrg  <variablelist remap='IP'>
1741d17cd367Smrg  <varlistentry>
1742d17cd367Smrg  <term><emphasis remap='I'>status_ret</emphasis></term>
1743d17cd367Smrg  <listitem>
1744d17cd367Smrg<para>Return status information.</para>
1745d17cd367Smrg  </listitem>
1746d17cd367Smrg  </varlistentry>
1747d17cd367Smrg</variablelist>
1748d17cd367Smrg
1749d17cd367Smrg
1750d17cd367Smrg<para>The status_ret argument is set to one of the following values:</para>
1751d17cd367Smrg<itemizedlist>
1752d17cd367Smrg  <listitem>
1753d17cd367Smrg<para><function>IceAcceptSuccess</function>
1754d17cd367Smrg- the accept operation succeeded,
1755d17cd367Smrgand the function returns a new connection object.</para>
1756d17cd367Smrg  </listitem>
1757d17cd367Smrg  <listitem>
1758d17cd367Smrg<para><function>IceAcceptFailure</function>
1759d17cd367Smrg- the accept operation failed, and the function returns NULL.</para>
1760d17cd367Smrg  </listitem>
1761d17cd367Smrg  <listitem>
1762d17cd367Smrg<para><function>IceAcceptBadMalloc</function>
1763d17cd367Smrg- a memory allocation failed, and the function returns NULL.</para>
1764d17cd367Smrg  </listitem>
1765d17cd367Smrg</itemizedlist>
1766d17cd367Smrg
1767d17cd367Smrg<para>In general, to detect new connections, you should call
1768d17cd367Smrg<function>select</function>
1769d17cd367Smrgon the file descriptors associated with the listen objects.
1770d17cd367SmrgWhen a new connection is detected, the
1771d17cd367Smrg<function>IceAcceptConnection</function>
1772d17cd367Smrgfunction should be called.
1773d17cd367Smrg<function>IceAcceptConnection</function>
1774d17cd367Smrgmay return a new ICE connection that is in a pending state.  This is because
1775d17cd367Smrgbefore the connection can become valid, authentication may be necessary.
1776d17cd367SmrgBecause the ICE library cannot block and wait for the connection to
1777d17cd367Smrgbecome valid (infinite blocking can occur if the connecting client
1778d17cd367Smrgdoes not act properly), the application must wait for the connection status
1779d17cd367Smrgto become valid.</para>
1780d17cd367Smrg
1781d17cd367Smrg<para>The following pseudo-code demonstrates how connections are accepted:</para>
1782d17cd367Smrg
1783d17cd367Smrg<literallayout class="monospaced">
1784d17cd367Smrgnew_ice_conn = IceAcceptConnection (listen_obj, &amp;accept_status);
1785d17cd367Smrgif (accept_status != IceAcceptSuccess)
1786d17cd367Smrg{
1787d17cd367Smrg     close the file descriptor and return
1788d17cd367Smrg}
1789d17cd367Smrg
1790d17cd367Smrgstatus = IceConnectionStatus (new_ice_conn);
1791d17cd367Smrgtime_start = time_now;
1792d17cd367Smrg
1793d17cd367Smrgwhile (status == IceConnectPending)
1794d17cd367Smrg{
1795d17cd367Smrg     select() on {new_ice_conn, all open connections}
1796d17cd367Smrg
1797d17cd367Smrg     for (each ice_conn in the list of open connections)
1798d17cd367Smrg          if (data ready on ice_conn)
1799d17cd367Smrg          {
1800d17cd367Smrg               status = IceProcessMessages (ice_conn, NULL, NULL);
1801d17cd367Smrg               if (status == IceProcessMessagesIOError)
1802d17cd367Smrg                    IceCloseConnection(ice_conn);
1803d17cd367Smrg          }
1804d17cd367Smrg     if data ready on new_ice_conn
1805d17cd367Smrg     {
1806d17cd367Smrg          /*
1807d17cd367Smrg          * IceProcessMessages is called until the connection
1808d17cd367Smrg          * is non-pending.  Doing so handles the connection
1809d17cd367Smrg          * setup request and any authentication requirements.
1810d17cd367Smrg          */
1811d17cd367Smrg
1812d17cd367Smrg          IceProcessMessages ( new_ice_conn, NULL, NULL);
1813d17cd367Smrg          status = IceConnectionStatus (new_ice_conn);
1814d17cd367Smrg     }
1815d17cd367Smrg     else
1816d17cd367Smrg     {
1817d17cd367Smrg          if (time_now - time_start &gt; MAX_WAIT_TIME)
1818d17cd367Smrg               status = IceConnectRejected;
1819d17cd367Smrg     }
1820d17cd367Smrg}
1821d17cd367Smrg
1822d17cd367Smrgif (status == IceConnectAccepted)
1823d17cd367Smrg{
1824d17cd367Smrg     Add new_ice_conn to the list of open connections
1825d17cd367Smrg}
1826d17cd367Smrgelse
1827d17cd367Smrg{
1828d17cd367Smrg     IceCloseConnection
1829d17cd367Smrg     new_ice_conn
1830d17cd367Smrg}
1831d17cd367Smrg</literallayout>
1832d17cd367Smrg
1833d17cd367Smrg<para>After
1834d17cd367Smrg<function>IceAcceptConnection</function>
1835d17cd367Smrgis called and the connection has been
1836d17cd367Smrgvalidated, the client is ready to receive a
1837d17cd367Smrg<function>ProtocolSetup</function>
1838d17cd367Smrg(provided
1839d17cd367Smrgthat
1840d17cd367Smrg<function>IceRegisterForProtocolReply</function>
1841d17cd367Smrgwas called) or send a
1842d17cd367Smrg<function>ProtocolSetup</function>
1843d17cd367Smrg(provided that
1844d17cd367Smrg<function>IceRegisterForProtocolSetup</function>
1845d17cd367Smrgwas called).</para>
1846d17cd367Smrg</sect1>
1847d17cd367Smrg
1848d17cd367Smrg<sect1 id='closing_ice_connections'>
1849d17cd367Smrg<title>Closing ICE Connections</title>
1850d17cd367Smrg
1851d17cd367Smrg<para>To close an ICE connection created with
1852d17cd367Smrg<function>IceOpenConnection</function>
1853d17cd367Smrgor
1854d17cd367Smrg<function>IceAcceptConnection</function>
1855d17cd367Smrguse
1856d17cd367Smrg<function>IceCloseConnection</function></para>
1857d17cd367Smrg
1858d17cd367Smrg<funcsynopsis>
1859d17cd367Smrg<funcprototype>
1860d17cd367Smrg  <funcdef>IceCloseStatus <function>IceCloseConnection</function></funcdef>
1861d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
1862d17cd367Smrg</funcprototype>
1863d17cd367Smrg</funcsynopsis>
1864d17cd367Smrg
1865d17cd367Smrg<variablelist remap='IP'>
1866d17cd367Smrg  <varlistentry>
1867d17cd367Smrg  <term><emphasis remap='I'>ice_conn</emphasis></term>
1868d17cd367Smrg  <listitem>
1869d17cd367Smrg  <para>The ICE connection to close.</para>
1870d17cd367Smrg  </listitem>
1871d17cd367Smrg  </varlistentry>
1872d17cd367Smrg</variablelist>
1873d17cd367Smrg
1874d17cd367Smrg<para>To actually close an ICE connection, the following conditions
1875d17cd367Smrgmust be met:</para>
1876d17cd367Smrg
1877d17cd367Smrg<itemizedlist>
1878d17cd367Smrg  <listitem>
1879d17cd367Smrg<para>The <emphasis remap='I'>open reference count</emphasis> must have reached zero on this ICE connection.
1880d17cd367SmrgWhen
1881d17cd367Smrg<function>IceOpenConnection</function>
1882d17cd367Smrgis called, it tries to use a previously opened
1883d17cd367SmrgICE connection.  If it is able to use an existing connection, it increments
1884d17cd367Smrgthe open reference count on the connection by one.
1885d17cd367SmrgSo, to close an ICE connection, each call to
1886d17cd367Smrg<function>IceOpenConnection</function>
1887d17cd367Smrgmust be matched with a call to
1888d17cd367Smrg<function>IceCloseConnection</function>
1889d17cd367SmrgThe connection can be closed only
1890d17cd367Smrgon the last call to
1891d17cd367Smrg<function>IceCloseConnection</function></para>
1892d17cd367Smrg  </listitem>
1893d17cd367Smrg  <listitem>
1894d17cd367Smrg<para>The <emphasis remap='I'>active protocol count</emphasis> must have reached zero.  Each time a
1895d17cd367Smrg<function>ProtocolSetup</function>
1896d17cd367Smrgsucceeds on the connection, the active protocol count
1897d17cd367Smrgis incremented by one.  When the client no longer expects to use the
1898d17cd367Smrgprotocol on the connection, the
1899d17cd367Smrg<function>IceProtocolShutdown</function>
1900d17cd367Smrgfunction should be called, which decrements the active protocol count
1901d17cd367Smrgby one (see
1902d17cd367Smrg<link linkend="protocol_setup_and_shutdown">
1903d17cd367Smrg<xref linkend="protocol_setup_and_shutdown"></xref></link>).
1904d17cd367Smrg</para>
1905d17cd367Smrg  </listitem>
1906d17cd367Smrg  <listitem>
1907d17cd367Smrg<para>If shutdown negotiation is enabled on the connection, the client on the other
1908d17cd367Smrgside of the ICE connection must agree to have the connection closed.</para>
1909d17cd367Smrg
1910d17cd367Smrg<para><function>IceCloseConnection</function>
1911d17cd367Smrgreturns one of the following values:</para>
1912d17cd367Smrg  </listitem>
1913d17cd367Smrg  <listitem>
1914d17cd367Smrg<para><function>IceClosedNow</function>
1915d17cd367Smrg- the ICE connection was closed at this time.  The watch procedures were
1916d17cd367Smrginvoked and the connection was freed.</para>
1917d17cd367Smrg  </listitem>
1918d17cd367Smrg  <listitem>
1919d17cd367Smrg<para><function>IceClosedASAP</function>
1920d17cd367Smrg- an IO error had occurred on the connection, but
1921d17cd367Smrg<function>IceCloseConnection</function>
1922d17cd367Smrgis being called within a nested
1923d17cd367Smrg<function>IceProcessMessages</function>
1924d17cd367SmrgThe watch procedures have been invoked at this time, but the connection
1925d17cd367Smrgwill be freed as soon as possible (when the nesting level reaches zero and
1926d17cd367Smrg<function>IceProcessMessages</function>
1927d17cd367Smrgreturns a status of
1928d17cd367Smrg<function>IceProcessMessagesConnectionClosed</function></para>
1929d17cd367Smrg  </listitem>
1930d17cd367Smrg  <listitem>
1931d17cd367Smrg<para><function>IceConnectionInUse</function>
1932d17cd367Smrg- the connection was not closed at this time, because it is being used by
1933d17cd367Smrgother active protocols.</para>
1934d17cd367Smrg  </listitem>
1935d17cd367Smrg  <listitem>
1936d17cd367Smrg<para><function>IceStartedShutdownNegotiation</function>
1937d17cd367Smrg- the connection was not closed at this time and shutdown negotiation started
1938d17cd367Smrgwith the client on the other side of the ICE connection.  When the connection
1939d17cd367Smrgis actually closed,
1940d17cd367Smrg<function>IceProcessMessages</function>
1941d17cd367Smrgwill return a status of
1942d17cd367Smrg<function>IceProcessMessagesConnectionClosed</function></para>
1943d17cd367Smrg  </listitem>
1944d17cd367Smrg</itemizedlist>
1945d17cd367Smrg
1946d17cd367Smrg<para>When it is known that the client on the other side of the ICE connection
1947d17cd367Smrghas terminated the connection without initiating shutdown negotiation, the
1948d17cd367Smrg<function>IceSetShutdownNegotiation</function>
1949d17cd367Smrgfunction should be called to turn off shutdown negotiation.  This will prevent
1950d17cd367Smrg<function>IceCloseConnection</function>
1951d17cd367Smrgfrom writing to a broken connection.</para>
1952d17cd367Smrg
1953d17cd367Smrg<funcsynopsis>
1954d17cd367Smrg<funcprototype>
1955d17cd367Smrg  <funcdef>void <function>IceSetShutdownNegotiation</function></funcdef>
1956d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
1957d17cd367Smrg    <paramdef>Bool<parameter> negotiate</parameter></paramdef>
1958d17cd367Smrg</funcprototype>
1959d17cd367Smrg</funcsynopsis>
1960d17cd367Smrg
1961d17cd367Smrg<variablelist remap='IP'>
1962d17cd367Smrg  <varlistentry>
1963d17cd367Smrg  <term><emphasis remap='I'>ice_conn</emphasis></term>
1964d17cd367Smrg  <listitem>
1965d17cd367Smrg  <para>A valid ICE connection object.</para>
1966d17cd367Smrg  </listitem>
1967d17cd367Smrg  </varlistentry>
1968d17cd367Smrg  <varlistentry>
1969d17cd367Smrg  <term><emphasis remap='I'>negotiate</emphasis></term>
1970d17cd367Smrg  <listitem>
1971d17cd367Smrg<para>If
1972d17cd367Smrg<function>False</function>
1973d17cd367Smrgshutdown negotiating will be turned off.</para>
1974d17cd367Smrg  </listitem>
1975d17cd367Smrg  </varlistentry>
1976d17cd367Smrg</variablelist>
1977d17cd367Smrg
1978d17cd367Smrg<para>To check the shutdown negotiation status of an ICE connection, use
1979d17cd367Smrg<function>IceCheckShutdownNegotiation</function></para>
1980d17cd367Smrg
1981d17cd367Smrg<funcsynopsis>
1982d17cd367Smrg<funcprototype>
1983d17cd367Smrg  <funcdef>Bool <function>IceCheckShutdownNegotiation</function></funcdef>
1984d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
1985d17cd367Smrg</funcprototype>
1986d17cd367Smrg</funcsynopsis>
1987d17cd367Smrg
1988d17cd367Smrg<variablelist remap='IP'>
1989d17cd367Smrg  <varlistentry>
1990d17cd367Smrg  <term><emphasis remap='I'>ice_conn</emphasis></term>
1991d17cd367Smrg  <listitem>
1992d17cd367Smrg  <para>A valid ICE connection object.</para>
1993d17cd367Smrg  </listitem>
1994d17cd367Smrg  </varlistentry>
1995d17cd367Smrg</variablelist>
1996d17cd367Smrg
1997d17cd367Smrg
1998d17cd367Smrg<para><function>IceCheckShutdownNegotiation</function>
1999d17cd367Smrgreturns
2000d17cd367Smrg<function>True</function>
2001d17cd367Smrgif shutdown negotiation will take place on the connection;
2002d17cd367Smrgotherwise, it returns
2003d17cd367Smrg<function>False</function>
2004d17cd367SmrgNegotiation is on by default for a connection.  It
2005d17cd367Smrgcan only be changed with the
2006d17cd367Smrg<function>IceSetShutdownNegotiation</function>
2007d17cd367Smrgfunction.</para>
2008d17cd367Smrg</sect1>
2009d17cd367Smrg
2010d17cd367Smrg<sect1 id='connection_watch_procedures'>
2011d17cd367Smrg<title>Connection Watch Procedures</title>
2012d17cd367Smrg
2013d17cd367Smrg<para>To add a watch procedure that will be called
2014d17cd367Smrgeach time ICElib opens a new connection via
2015d17cd367Smrg<function>IceOpenConnection</function>
2016d17cd367Smrgor
2017d17cd367Smrg<function>IceAcceptConnection</function>
2018d17cd367Smrgor closes a connection via
2019d17cd367Smrg<function>IceCloseConnection</function>
2020d17cd367Smrguse
2021d17cd367Smrg<function>IceAddConnectionWatch</function></para>
2022d17cd367Smrg
2023d17cd367Smrg<funcsynopsis>
2024d17cd367Smrg<funcprototype>
2025d17cd367Smrg  <funcdef>Status <function>IceAddConnectionWatch</function></funcdef>
2026d17cd367Smrg    <paramdef>IceWatchProc<parameter> watch_proc</parameter></paramdef>
2027d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2028d17cd367Smrg</funcprototype>
2029d17cd367Smrg</funcsynopsis>
2030d17cd367Smrg
2031d17cd367Smrg<variablelist remap='IP'>
2032d17cd367Smrg  <varlistentry>
2033d17cd367Smrg    <term><emphasis remap='I'>watch_proc</emphasis></term>
2034d17cd367Smrg    <listitem>
2035d17cd367Smrg      <para>
2036d17cd367SmrgThe watch procedure to invoke when ICElib opens or closes a connection.
2037d17cd367Smrg      </para>
2038d17cd367Smrg    </listitem>
2039d17cd367Smrg  </varlistentry>
2040d17cd367Smrg  <varlistentry>
2041d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
2042d17cd367Smrg    <listitem>
2043d17cd367Smrg      <para>This pointer will be passed to the watch procedure.</para>
2044d17cd367Smrg    </listitem>
2045d17cd367Smrg  </varlistentry>
2046d17cd367Smrg</variablelist>
2047d17cd367Smrg
2048d17cd367Smrg
2049d17cd367Smrg<para>
2050d17cd367SmrgThe return value of <function>IceAddConnectionWatch</function>
2051d17cd367Smrgis zero for failure, and a positive value for success.
2052d17cd367Smrg</para>
2053d17cd367Smrg
2054d17cd367Smrg<para>
2055d17cd367SmrgNote that several calls to <function>IceOpenConnection</function>
2056d17cd367Smrgmight share the same ICE connection.  In such a case, the watch procedure
2057d17cd367Smrgis only invoked when the connection is first created (after authentication
2058d17cd367Smrgsucceeds).  Similarly, because connections might be shared, the
2059d17cd367Smrgwatch procedure is called only if <function>IceCloseConnection</function>
2060d17cd367Smrgactually closes the connection (right before the IceConn is freed).
2061d17cd367Smrg</para>
2062d17cd367Smrg
2063d17cd367Smrg<para>
2064d17cd367SmrgThe watch procedures are very useful for applications that
2065d17cd367Smrgneed to add a file descriptor to a select mask when a new connection
2066d17cd367Smrgis created and remove the file descriptor when the connection is destroyed.
2067d17cd367SmrgBecause connections are shared, knowing when to add and remove the file
2068d17cd367Smrgdescriptor from the select mask would be difficult without the watch
2069d17cd367Smrgprocedures.
2070d17cd367Smrg</para>
2071d17cd367Smrg
2072d17cd367Smrg<para>
2073d17cd367SmrgMultiple watch procedures may be registered with the ICE library.
2074d17cd367SmrgNo assumptions should be made about their order of invocation.
2075d17cd367Smrg</para>
2076d17cd367Smrg
2077d17cd367Smrg<para>
2078d17cd367SmrgIf one or more ICE connections were already created by the ICE library at the
2079d17cd367Smrgtime the watch procedure is registered, the watch procedure will instantly
2080d17cd367Smrgbe invoked for each of these ICE connections (with the opening argument
2081d17cd367Smrgset to <function>True</function>
2082d17cd367Smrg</para>
2083d17cd367Smrg
2084d17cd367Smrg<para>
2085d17cd367SmrgThe watch procedure is of type <function>IceWatchProc</function>
2086d17cd367Smrg</para>
2087d17cd367Smrg
2088d17cd367Smrg<funcsynopsis>
2089d17cd367Smrg<funcprototype>
2090d17cd367Smrg  <funcdef>void <function>WatchProc</function></funcdef>
2091d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2092d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2093d17cd367Smrg    <paramdef>Bool<parameter> opening</parameter></paramdef>
2094d17cd367Smrg    <paramdef>IcePointer<parameter> *watch_data</parameter></paramdef>
2095d17cd367Smrg</funcprototype>
2096d17cd367Smrg</funcsynopsis>
2097d17cd367Smrg
2098d17cd367Smrg<variablelist remap='IP'>
2099d17cd367Smrg  <varlistentry>
2100d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2101d17cd367Smrg    <listitem>
2102d17cd367Smrg      <para>
2103d17cd367SmrgThe opened or closed ICE connection.  Call
2104d17cd367Smrg<function>IceConnectionNumber</function>
2105d17cd367Smrgto get the file descriptor associated with this connection.
2106d17cd367Smrg      </para>
2107d17cd367Smrg    </listitem>
2108d17cd367Smrg  </varlistentry>
2109d17cd367Smrg  <varlistentry>
2110d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
2111d17cd367Smrg    <listitem>
2112d17cd367Smrg      <para>
2113d17cd367SmrgClient data specified in the call to
2114d17cd367Smrg<function>IceAddConnectionWatch</function>
2115d17cd367Smrg      </para>
2116d17cd367Smrg    </listitem>
2117d17cd367Smrg  </varlistentry>
2118d17cd367Smrg  <varlistentry>
2119d17cd367Smrg    <term><emphasis remap='I'>opening</emphasis></term>
2120d17cd367Smrg    <listitem>
2121d17cd367Smrg      <para>
2122d17cd367SmrgIf <function>True</function> the connection is being opened.  If
2123d17cd367Smrg<function>False</function> the connection is being closed.
2124d17cd367Smrg      </para>
2125d17cd367Smrg    </listitem>
2126d17cd367Smrg  </varlistentry>
2127d17cd367Smrg  <varlistentry>
2128d17cd367Smrg    <term><emphasis remap='I'>watch_data</emphasis></term>
2129d17cd367Smrg    <listitem>
2130d17cd367Smrg      <para>Can be used to save a pointer to client data.</para>
2131d17cd367Smrg    </listitem>
2132d17cd367Smrg  </varlistentry>
2133d17cd367Smrg</variablelist>
2134d17cd367Smrg
2135d17cd367Smrg<para>
2136d17cd367SmrgIf opening is <function>True</function> the client should set the
2137d17cd367Smrg*watch_data pointer to any data it may need to save until the connection
2138d17cd367Smrgis closed and the watch procedure is invoked again with opening set to
2139d17cd367Smrg<function>False</function>
2140d17cd367Smrg</para>
2141d17cd367Smrg
2142d17cd367Smrg<para>
2143d17cd367SmrgTo remove a watch procedure, use
2144d17cd367Smrg<function>IceRemoveConnectionWatch</function>
2145d17cd367Smrg</para>
2146d17cd367Smrg
2147d17cd367Smrg<funcsynopsis>
2148d17cd367Smrg<funcprototype>
2149d17cd367Smrg  <funcdef>void <function>IceRemoveConnectionWatch</function></funcdef>
2150d17cd367Smrg    <paramdef>IceWatchProc<parameter> watch_proc</parameter></paramdef>
2151d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2152d17cd367Smrg</funcprototype>
2153d17cd367Smrg</funcsynopsis>
2154d17cd367Smrg
2155d17cd367Smrg<variablelist remap='IP'>
2156d17cd367Smrg  <varlistentry>
2157d17cd367Smrg    <term><emphasis remap='I'>watch_proc</emphasis></term>
2158d17cd367Smrg    <listitem>
2159d17cd367Smrg      <para>
2160d17cd367SmrgThe watch procedure that was passed to
2161d17cd367Smrg<function>IceAddConnectionWatch</function>
2162d17cd367Smrg      </para>
2163d17cd367Smrg    </listitem>
2164d17cd367Smrg  </varlistentry>
2165d17cd367Smrg  <varlistentry>
2166d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
2167d17cd367Smrg    <listitem>
2168d17cd367Smrg      <para>
2169d17cd367SmrgThe client_data pointer that was passed to
2170d17cd367Smrg<function>IceAddConnectionWatch</function>
2171d17cd367Smrg      </para>
2172d17cd367Smrg    </listitem>
2173d17cd367Smrg  </varlistentry>
2174d17cd367Smrg</variablelist>
2175d17cd367Smrg
2176d17cd367Smrg</sect1>
2177d17cd367Smrg</chapter>
2178d17cd367Smrg
2179d17cd367Smrg<chapter id='protocol_setup_and_shutdown'>
2180d17cd367Smrg<title>Protocol Setup and Shutdown</title>
2181d17cd367Smrg
2182d17cd367Smrg<para>
2183d17cd367SmrgTo activate a protocol on a given ICE connection, use
2184d17cd367Smrg<function>IceProtocolSetup</function>
2185d17cd367Smrg</para>
2186d17cd367Smrg
2187d17cd367Smrg<funcsynopsis>
2188d17cd367Smrg<funcprototype>
2189d17cd367Smrg  <funcdef>IceProtocolSetupStatus <function>IceProtocolSetup</function></funcdef>
2190d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2191d17cd367Smrg    <paramdef>int<parameter> my_opcode</parameter></paramdef>
2192d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2193d17cd367Smrg    <paramdef>Bool<parameter> must_authenticate</parameter></paramdef>
2194d17cd367Smrg    <paramdef>int<parameter> *major_version_ret</parameter></paramdef>
2195d17cd367Smrg    <paramdef>int<parameter> *minor_version_ret</parameter></paramdef>
2196d17cd367Smrg    <paramdef>char<parameter> **vendor_ret</parameter></paramdef>
2197d17cd367Smrg    <paramdef>char<parameter> **release_ret</parameter></paramdef>
2198d17cd367Smrg    <paramdef>int<parameter> error_length</parameter></paramdef>
2199d17cd367Smrg    <paramdef>char<parameter> *error_string_ret</parameter></paramdef>
2200d17cd367Smrg</funcprototype>
2201d17cd367Smrg</funcsynopsis>
2202d17cd367Smrg
2203d17cd367Smrg<variablelist remap='IP'>
2204d17cd367Smrg  <varlistentry>
2205d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2206d17cd367Smrg    <listitem>
2207d17cd367Smrg      <para>A valid ICE connection object.</para>
2208d17cd367Smrg    </listitem>
2209d17cd367Smrg  </varlistentry>
2210d17cd367Smrg  <varlistentry>
2211d17cd367Smrg    <term><emphasis remap='I'>my_opcode</emphasis></term>
2212d17cd367Smrg    <listitem>
2213d17cd367Smrg      <para>
2214d17cd367SmrgThe major opcode of the protocol to be set up, as returned by
2215d17cd367Smrg<function>IceRegisterForProtocolSetup</function>
2216d17cd367Smrg      </para>
2217d17cd367Smrg    </listitem>
2218d17cd367Smrg  </varlistentry>
2219d17cd367Smrg  <varlistentry>
2220d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
2221d17cd367Smrg    <listitem>
2222d17cd367Smrg      <para>
2223d17cd367SmrgThe client data stored in this pointer will be passed to the
2224d17cd367Smrg<function>IcePoProcessMsgProc</function> callback.
2225d17cd367Smrg      </para>
2226d17cd367Smrg    </listitem>
2227d17cd367Smrg  </varlistentry>
2228d17cd367Smrg  <varlistentry>
2229d17cd367Smrg    <term><emphasis remap='I'>must_authenticate</emphasis></term>
2230d17cd367Smrg    <listitem>
2231d17cd367Smrg      <para>
2232d17cd367SmrgIf <function>True</function> the other client may
2233d17cd367Smrgnot bypass authentication.
2234d17cd367Smrg      </para>
2235d17cd367Smrg    </listitem>
2236d17cd367Smrg  </varlistentry>
2237d17cd367Smrg  <varlistentry>
2238d17cd367Smrg    <term><emphasis remap='I'>major_version_ret</emphasis></term>
2239d17cd367Smrg    <listitem>
2240d17cd367Smrg      <para>The major version of the protocol to be used is returned.</para>
2241d17cd367Smrg    </listitem>
2242d17cd367Smrg  </varlistentry>
2243d17cd367Smrg  <varlistentry>
2244d17cd367Smrg    <term><emphasis remap='I'>minor_version_ret</emphasis></term>
2245d17cd367Smrg    <listitem>
2246d17cd367Smrg      <para>The minor version of the protocol to be used is returned.</para>
2247d17cd367Smrg    </listitem>
2248d17cd367Smrg  </varlistentry>
2249d17cd367Smrg  <varlistentry>
2250d17cd367Smrg    <term><emphasis remap='I'>vendor_ret</emphasis></term>
2251d17cd367Smrg    <listitem>
2252d17cd367Smrg      <para>The vendor string specified by the protocol acceptor.</para>
2253d17cd367Smrg    </listitem>
2254d17cd367Smrg  </varlistentry>
2255d17cd367Smrg  <varlistentry>
2256d17cd367Smrg    <term><emphasis remap='I'>release_ret</emphasis></term>
2257d17cd367Smrg    <listitem>
2258d17cd367Smrg      <para>The release string specified by the protocol acceptor.</para>
2259d17cd367Smrg    </listitem>
2260d17cd367Smrg  </varlistentry>
2261d17cd367Smrg  <varlistentry>
2262d17cd367Smrg    <term><emphasis remap='I'>error_length</emphasis></term>
2263d17cd367Smrg    <listitem>
2264d17cd367Smrg      <para>
2265d17cd367SmrgSpecifies the length of the error_string_ret argument passed in.
2266d17cd367Smrg      </para>
2267d17cd367Smrg    </listitem>
2268d17cd367Smrg  </varlistentry>
2269d17cd367Smrg  <varlistentry>
2270d17cd367Smrg    <term><emphasis remap='I'>error_string_ret</emphasis></term>
2271d17cd367Smrg    <listitem>
2272d17cd367Smrg      <para>
2273d17cd367SmrgReturns a null-terminated error message, if any.
2274d17cd367SmrgThe error_string_ret argument points to user supplied memory.
2275d17cd367SmrgNo more than error_length bytes are used.
2276d17cd367Smrg      </para>
2277d17cd367Smrg    </listitem>
2278d17cd367Smrg  </varlistentry>
2279d17cd367Smrg</variablelist>
2280d17cd367Smrg
2281d17cd367Smrg<para>
2282d17cd367SmrgThe vendor_ret and release_ret strings should be freed with
2283d17cd367Smrg<function>free</function> when no longer needed.
2284d17cd367Smrg</para>
2285d17cd367Smrg
2286d17cd367Smrg<para>
2287d17cd367Smrg<function>IceProtocolSetup</function> returns one of the following values:
2288d17cd367Smrg</para>
2289d17cd367Smrg
2290d17cd367Smrg<itemizedlist>
2291d17cd367Smrg  <listitem>
2292d17cd367Smrg    <para>
2293d17cd367Smrg<function>IceProtocolSetupSuccess</function> - the major_version_ret,
2294d17cd367Smrgminor_version_ret, vendor_ret, release_ret are set.
2295d17cd367Smrg    </para>
2296d17cd367Smrg  </listitem>
2297d17cd367Smrg  <listitem>
2298d17cd367Smrg    <para>
2299d17cd367Smrg<function>IceProtocolSetupFailure</function> or
2300d17cd367Smrg<function>IceProtocolSetupIOError</function>
2301d17cd367Smrg- check error_string_ret for failure reason.  The major_version_ret,
2302d17cd367Smrgminor_version_ret, vendor_ret, release_ret are not set.
2303d17cd367Smrg    </para>
2304d17cd367Smrg  </listitem>
2305d17cd367Smrg  <listitem>
2306d17cd367Smrg    <para>
2307d17cd367Smrg<function>IceProtocolAlreadyActive</function>
2308d17cd367Smrg- this protocol is already active on this connection.
2309d17cd367SmrgThe major_version_ret, minor_version_ret, vendor_ret, release_ret
2310d17cd367Smrgare not set.
2311d17cd367Smrg    </para>
2312d17cd367Smrg  </listitem>
2313d17cd367Smrg</itemizedlist>
2314d17cd367Smrg
2315d17cd367Smrg<para>
2316d17cd367SmrgTo notify the ICE library when a given protocol will no longer be used
2317d17cd367Smrgon an ICE connection, use <function>IceProtocolShutdown</function>
2318d17cd367Smrg</para>
2319d17cd367Smrg
2320d17cd367Smrg<funcsynopsis>
2321d17cd367Smrg<funcprototype>
2322d17cd367Smrg  <funcdef>Status <function>IceProtocolShutdown</function></funcdef>
2323d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2324d17cd367Smrg    <paramdef>int<parameter> major_opcode</parameter></paramdef>
2325d17cd367Smrg</funcprototype>
2326d17cd367Smrg</funcsynopsis>
2327d17cd367Smrg
2328d17cd367Smrg<variablelist remap='IP'>
2329d17cd367Smrg  <varlistentry>
2330d17cd367Smrg  <term><emphasis remap='I'>ice_conn</emphasis></term>
2331d17cd367Smrg    <listitem>
2332d17cd367Smrg      <para>A valid ICE connection object.</para>
2333d17cd367Smrg    </listitem>
2334d17cd367Smrg  </varlistentry>
2335d17cd367Smrg  <varlistentry>
2336d17cd367Smrg    <term><emphasis remap='I'>major_opcode</emphasis></term>
2337d17cd367Smrg    <listitem>
2338d17cd367Smrg      <para>The major opcode of the protocol to shut down.</para>
2339d17cd367Smrg    </listitem>
2340d17cd367Smrg  </varlistentry>
2341d17cd367Smrg</variablelist>
2342d17cd367Smrg
2343d17cd367Smrg
2344d17cd367Smrg<para>
2345d17cd367SmrgThe return value of <function>IceProtocolShutdown</function>
2346d17cd367Smrgis zero for failure and a positive value for success.
2347d17cd367Smrg</para>
2348d17cd367Smrg
2349d17cd367Smrg<para>
2350d17cd367SmrgFailure will occur if the major opcode was never registered OR the protocol
2351d17cd367Smrgof the major opcode was never activated on the connection.  By activated,
2352d17cd367Smrgwe mean that a <function>ProtocolSetup</function> succeeded on the connection.
2353d17cd367SmrgNote that ICE does not define how each sub-protocol triggers a
2354d17cd367Smrgprotocol shutdown.
2355d17cd367Smrg</para>
2356d17cd367Smrg</chapter>
2357d17cd367Smrg
2358d17cd367Smrg<chapter id='processing_messages'>
2359d17cd367Smrg<title>Processing Messages</title>
2360d17cd367Smrg
2361d17cd367Smrg
2362d17cd367Smrg<para>To process incoming messages on an ICE connection, use
2363d17cd367Smrg<function>IceProcessMessages</function></para>
2364d17cd367Smrg
2365d17cd367Smrg<funcsynopsis>
2366d17cd367Smrg<funcprototype>
2367d17cd367Smrg  <funcdef>IceProcessMessagesStatus <function>IceProcessMessages</function></funcdef>
2368d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2369d17cd367Smrg    <paramdef>IceReplyWaitInfo<parameter> *reply_wait</parameter></paramdef>
2370d17cd367Smrg    <paramdef>Bool<parameter> *reply_ready_ret</parameter></paramdef>
2371d17cd367Smrg</funcprototype>
2372d17cd367Smrg</funcsynopsis>
2373d17cd367Smrg
2374d17cd367Smrg<variablelist remap='IP'>
2375d17cd367Smrg  <varlistentry>
2376d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2377d17cd367Smrg    <listitem>
2378d17cd367Smrg      <para>A valid ICE connection object.</para>
2379d17cd367Smrg    </listitem>
2380d17cd367Smrg  </varlistentry>
2381d17cd367Smrg  <varlistentry>
2382d17cd367Smrg    <term><emphasis remap='I'>reply_wait</emphasis></term>
2383d17cd367Smrg    <listitem>
2384d17cd367Smrg      <para>Indicates if a reply is being waited for.</para>
2385d17cd367Smrg    </listitem>
2386d17cd367Smrg  </varlistentry>
2387d17cd367Smrg  <varlistentry>
2388d17cd367Smrg    <term><emphasis remap='I'>reply_ready_ret</emphasis></term>
2389d17cd367Smrg    <listitem>
2390d17cd367Smrg      <para>
2391d17cd367SmrgIf set to <function>True</function> on return, a reply is ready.
2392d17cd367Smrg      </para>
2393d17cd367Smrg    </listitem>
2394d17cd367Smrg  </varlistentry>
2395d17cd367Smrg</variablelist>
2396d17cd367Smrg
2397d17cd367Smrg<para>
2398d17cd367Smrg<function>IceProcessMessages</function> is used in two ways:
2399d17cd367Smrg</para>
2400d17cd367Smrg
2401d17cd367Smrg<itemizedlist>
2402d17cd367Smrg  <listitem>
2403d17cd367Smrg    <para>
2404d17cd367SmrgIn the first, a client may generate a message and block by calling
2405d17cd367Smrg<function>IceProcessMessages</function> repeatedly until it gets its reply.
2406d17cd367Smrg    </para>
2407d17cd367Smrg  </listitem>
2408d17cd367Smrg  <listitem>
2409d17cd367Smrg    <para>
2410d17cd367SmrgIn the second, a client calls <function>IceProcessMessages</function>
2411d17cd367Smrgwith reply_wait set to NULL in response to <function>select</function>
2412d17cd367Smrgshowing that there is data to read on the ICE connection.
2413d17cd367SmrgThe ICE library may process zero or more complete messages.
2414d17cd367SmrgNote that messages that are not blocked for are always processed by
2415d17cd367Smrginvoking callbacks.
2416d17cd367Smrg    </para>
2417d17cd367Smrg  </listitem>
2418d17cd367Smrg</itemizedlist>
2419d17cd367Smrg
2420d17cd367Smrg<para>
2421d17cd367Smrg<function>IceReplyWaitInfo</function> contains the major/minor opcodes
2422d17cd367Smrgand sequence number of the message for which a reply is being awaited.
2423d17cd367SmrgIt also contains a pointer to the reply message to be filled in (the
2424d17cd367Smrgprotocol library should cast this <function>IcePointer</function>
2425d17cd367Smrgto the appropriate reply type).  In most
2426d17cd367Smrgcases, the reply will have some fixed-size part, and the client waiting
2427d17cd367Smrgfor the reply will have provided a pointer to a structure to hold
2428d17cd367Smrgthis fixed-size data.  If there is variable-length data, it would be
2429d17cd367Smrgexpected that the
2430d17cd367Smrg<function>IcePoProcessMsgProc</function>
2431d17cd367Smrgcallback will have to allocate additional
2432d17cd367Smrgmemory and store pointer(s) to that memory in the fixed-size
2433d17cd367Smrgstructure.  If the entire data is variable length (for example, a single
2434d17cd367Smrgvariable-length string), then the client waiting for the reply would probably
2435d17cd367Smrgjust pass a pointer to fixed-size space to hold a pointer, and the
2436d17cd367Smrg<function>IcePoProcessMsgProc</function>
2437d17cd367Smrgcallback would allocate the storage and store the pointer.
2438d17cd367SmrgIt is the responsibility of the client receiving the reply to
2439d17cd367Smrgfree up any memory allocated on its behalf.
2440d17cd367Smrg</para>
2441d17cd367Smrg
2442d17cd367Smrg<literallayout class="monospaced">
2443d17cd367Smrgtypedef struct {
2444d17cd367Smrg     unsigned long sequence_of_request;
2445d17cd367Smrg     int major_opcode_of_request;
2446d17cd367Smrg     int minor_opcode_of_request;
2447d17cd367Smrg     IcePointer reply;
2448d17cd367Smrg} IceReplyWaitInfo;
2449d17cd367Smrg</literallayout>
2450d17cd367Smrg
2451d17cd367Smrg<para>
2452d17cd367SmrgIf reply_wait is not NULL and
2453d17cd367Smrg<function>IceProcessMessages</function>
2454d17cd367Smrghas a reply or error to return in response to this reply_wait
2455d17cd367Smrg(that is, no callback was generated), then the reply_ready_ret argument
2456d17cd367Smrgwill be set to <function>True</function>
2457d17cd367Smrg</para>
2458d17cd367Smrg
2459d17cd367Smrg<para>
2460d17cd367SmrgIf reply_wait is NULL, then the caller may also pass NULL for
2461d17cd367Smrgreply_ready_ret and be guaranteed that no value will be stored in
2462d17cd367Smrgthis pointer.
2463d17cd367Smrg</para>
2464d17cd367Smrg
2465d17cd367Smrg<para>
2466d17cd367Smrg<function>IceProcessMessages</function> returns one of the following values:
2467d17cd367Smrg</para>
2468d17cd367Smrg
2469d17cd367Smrg<itemizedlist>
2470d17cd367Smrg  <listitem>
2471d17cd367Smrg    <para>
2472d17cd367Smrg<function>IceProcessMessagesSuccess</function> - no error occurred.
2473d17cd367Smrg    </para>
2474d17cd367Smrg  </listitem>
2475d17cd367Smrg  <listitem>
2476d17cd367Smrg    <para>
2477d17cd367Smrg<function>IceProcessMessagesIOError</function> - an IO error occurred,
2478d17cd367Smrgand the caller must explicitly close the connection by calling
2479d17cd367Smrg<function>IceCloseConnection</function>
2480d17cd367Smrg    </para>
2481d17cd367Smrg  </listitem>
2482d17cd367Smrg  <listitem>
2483d17cd367Smrg    <para>
2484d17cd367Smrg<function>IceProcessMessagesConnectionClosed</function>
2485d17cd367Smrg- the ICE connection has been closed (closing of the connection was deferred
2486d17cd367Smrgbecause of shutdown negotiation, or because the
2487d17cd367Smrg<function>IceProcessMessages</function>
2488d17cd367Smrgnesting level was not zero).  Do not attempt
2489d17cd367Smrgto access the ICE connection at this point, since it has been freed.
2490d17cd367Smrg    </para>
2491d17cd367Smrg  </listitem>
2492d17cd367Smrg</itemizedlist>
2493d17cd367Smrg
2494d17cd367Smrg</chapter>
2495d17cd367Smrg
2496d17cd367Smrg<chapter id='ping'>
2497d17cd367Smrg<title>Ping</title>
2498d17cd367Smrg
2499d17cd367Smrg<para>
2500d17cd367SmrgTo send a "Ping" message to the client on the other side of the
2501d17cd367SmrgICE connection, use <function>IcePing</function>
2502d17cd367Smrg</para>
2503d17cd367Smrg
2504d17cd367Smrg<funcsynopsis>
2505d17cd367Smrg<funcprototype>
2506d17cd367Smrg  <funcdef>Status <function>IcePing</function></funcdef>
2507d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2508d17cd367Smrg    <paramdef>IcePingReplyProc<parameter> ping_reply_proc</parameter></paramdef>
2509d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2510d17cd367Smrg</funcprototype>
2511d17cd367Smrg</funcsynopsis>
2512d17cd367Smrg
2513d17cd367Smrg<variablelist remap='IP'>
2514d17cd367Smrg  <varlistentry>
2515d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2516d17cd367Smrg    <listitem>
2517d17cd367Smrg      <para>A valid ICE connection object.</para>
2518d17cd367Smrg    </listitem>
2519d17cd367Smrg  </varlistentry>
2520d17cd367Smrg  <varlistentry>
2521d17cd367Smrg    <term><emphasis remap='I'>ping_reply_proc</emphasis></term>
2522d17cd367Smrg    <listitem>
2523d17cd367Smrg      <para>The callback to invoke when the Ping reply arrives.</para>
2524d17cd367Smrg    </listitem>
2525d17cd367Smrg  </varlistentry>
2526d17cd367Smrg  <varlistentry>
2527d17cd367Smrg    <term><emphasis remap='I'>client_data</emphasis></term>
2528d17cd367Smrg    <listitem>
2529d17cd367Smrg      <para>
2530d17cd367SmrgThis pointer will be passed to the <function>IcePingReplyProc</function>
2531d17cd367Smrgcallback.
2532d17cd367Smrg      </para>
2533d17cd367Smrg    </listitem>
2534d17cd367Smrg  </varlistentry>
2535d17cd367Smrg</variablelist>
2536d17cd367Smrg
2537d17cd367Smrg
2538d17cd367Smrg<para><function>IcePing</function>
2539d17cd367Smrgreturns zero for failure and a positive value for success.</para>
2540d17cd367Smrg
2541d17cd367Smrg<para>When
2542d17cd367Smrg<function>IceProcessMessages</function>
2543d17cd367Smrgprocesses the Ping reply, it will invoke the
2544d17cd367Smrg<function>IcePingReplyProc</function>
2545d17cd367Smrgcallback.</para>
2546d17cd367Smrg
2547d17cd367Smrg<funcsynopsis>
2548d17cd367Smrg<funcprototype>
2549d17cd367Smrg  <funcdef>void <function>PingReplyProc</function></funcdef>
2550d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2551d17cd367Smrg    <paramdef>IcePointer<parameter> client_data</parameter></paramdef>
2552d17cd367Smrg</funcprototype>
2553d17cd367Smrg</funcsynopsis>
2554d17cd367Smrg
2555d17cd367Smrg<variablelist remap='IP'>
2556d17cd367Smrg  <varlistentry>
2557d17cd367Smrg  <term><emphasis remap='I'>ice_conn</emphasis></term>
2558d17cd367Smrg  <listitem>
2559d17cd367Smrg<para>A valid ICE connection object.</para>
2560d17cd367Smrg  </listitem>
2561d17cd367Smrg  </varlistentry>
2562d17cd367Smrg  <varlistentry>
2563d17cd367Smrg  <term><emphasis remap='I'>client_data</emphasis></term>
2564d17cd367Smrg  <listitem>
2565d17cd367Smrg<para>The client data specified in the call to
2566d17cd367Smrg<function>IcePing</function></para>
2567d17cd367Smrg  </listitem>
2568d17cd367Smrg  </varlistentry>
2569d17cd367Smrg</variablelist>
2570d17cd367Smrg
2571d17cd367Smrg</chapter>
2572d17cd367Smrg
2573d17cd367Smrg<chapter id='using_icelib_informational_functions'>
2574d17cd367Smrg<title>Using ICElib Informational Functions</title>
2575d17cd367Smrg
2576d17cd367Smrg<funcsynopsis>
2577d17cd367Smrg<funcprototype>
2578d17cd367Smrg  <funcdef>IceConnectStatus <function>IceConnectionStatus</function></funcdef>
2579d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2580d17cd367Smrg</funcprototype>
2581d17cd367Smrg</funcsynopsis>
2582d17cd367Smrg
2583d17cd367Smrg<para><function>IceConnectionStatus</function>
2584d17cd367Smrgreturns the status of an ICE connection.  The possible return values are:</para>
2585d17cd367Smrg
2586d17cd367Smrg<itemizedlist>
2587d17cd367Smrg  <listitem>
2588d17cd367Smrg<para><function>IceConnectPending</function>
2589d17cd367Smrg- the connection is not valid yet (that is, authentication is taking place).
2590d17cd367SmrgThis is only relevant to connections created by
2591d17cd367Smrg<function>IceAcceptConnection</function></para>
2592d17cd367Smrg  </listitem>
2593d17cd367Smrg  <listitem>
2594d17cd367Smrg<para><function>IceConnectAccepted</function>
2595d17cd367Smrg- the connection has been accepted.
2596d17cd367SmrgThis is only relevant to connections created by
2597d17cd367Smrg<function>IceAcceptConnection</function></para>
2598d17cd367Smrg  </listitem>
2599d17cd367Smrg  <listitem>
2600d17cd367Smrg<para><function>IceConnectRejected</function>
2601d17cd367Smrg- the connection had been rejected  (that is, authentication failed).
2602d17cd367SmrgThis is only relevant to connections created by
2603d17cd367Smrg<function>IceAcceptConnection</function></para>
2604d17cd367Smrg  </listitem>
2605d17cd367Smrg  <listitem>
2606d17cd367Smrg<para><function>IceConnectIOError</function>
2607d17cd367Smrg- an IO error has occurred on the connection.</para>
2608d17cd367Smrg  </listitem>
2609d17cd367Smrg</itemizedlist>
2610d17cd367Smrg
2611d17cd367Smrg<funcsynopsis>
2612d17cd367Smrg<funcprototype>
2613d17cd367Smrg  <funcdef>char <function> *IceVendor</function></funcdef>
2614d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2615d17cd367Smrg</funcprototype>
2616d17cd367Smrg</funcsynopsis>
2617d17cd367Smrg
2618d17cd367Smrg<para><function>IceVendor</function>
2619d17cd367Smrgreturns the ICE library vendor identification
2620d17cd367Smrgfor the other side of the connection.
2621d17cd367SmrgThe string should be freed with a call to
2622d17cd367Smrg<function>free</function>
2623d17cd367Smrgwhen no longer needed.</para>
2624d17cd367Smrg
2625d17cd367Smrg<funcsynopsis>
2626d17cd367Smrg<funcprototype>
2627d17cd367Smrg  <funcdef>char <function> *IceRelease</function></funcdef>
2628d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2629d17cd367Smrg</funcprototype>
2630d17cd367Smrg</funcsynopsis>
2631d17cd367Smrg
2632d17cd367Smrg<para><function>IceRelease</function>
2633d17cd367Smrgreturns the release identification of the ICE library
2634d17cd367Smrgon the other side of the connection.
2635d17cd367SmrgThe string should be freed with a call to
2636d17cd367Smrg<function>free</function>
2637d17cd367Smrgwhen no longer needed.</para>
2638d17cd367Smrg
2639d17cd367Smrg<funcsynopsis>
2640d17cd367Smrg<funcprototype>
2641d17cd367Smrg  <funcdef>int <function> IceProtocolVersion</function></funcdef>
2642d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2643d17cd367Smrg</funcprototype>
2644d17cd367Smrg</funcsynopsis>
2645d17cd367Smrg
2646d17cd367Smrg<para><function>IceProtocolVersion</function>
2647d17cd367Smrgreturns the major version of the ICE protocol on this connection.</para>
2648d17cd367Smrg
2649d17cd367Smrg<funcsynopsis>
2650d17cd367Smrg<funcprototype>
2651d17cd367Smrg  <funcdef>int <function> IceProtocolRevision</function></funcdef>
2652d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2653d17cd367Smrg</funcprototype>
2654d17cd367Smrg</funcsynopsis>
2655d17cd367Smrg
2656d17cd367Smrg
2657d17cd367Smrg<para><function>IceProtocolRevision</function>
2658d17cd367Smrgreturns the minor version of the ICE protocol on this connection.</para>
2659d17cd367Smrg
2660d17cd367Smrg<funcsynopsis>
2661d17cd367Smrg<funcprototype>
2662d17cd367Smrg  <funcdef>int <function> IceConnectionNumber</function></funcdef>
2663d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2664d17cd367Smrg</funcprototype>
2665d17cd367Smrg</funcsynopsis>
2666d17cd367Smrg
2667d17cd367Smrg
2668d17cd367Smrg<para><function>IceConnectionNumber</function>
2669d17cd367Smrgreturns the file descriptor of this ICE connection.</para>
2670d17cd367Smrg
2671d17cd367Smrg<funcsynopsis>
2672d17cd367Smrg<funcprototype>
2673d17cd367Smrg  <funcdef>char <function> *IceConnectionString</function></funcdef>
2674d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2675d17cd367Smrg</funcprototype>
2676d17cd367Smrg</funcsynopsis>
2677d17cd367Smrg
2678d17cd367Smrg<para><function>IceConnectionString</function>
2679d17cd367Smrgreturns the network ID of the client that
2680d17cd367Smrgaccepted this connection.  The string should be freed with a call to
2681d17cd367Smrg<function>free</function>
2682d17cd367Smrgwhen no longer needed.</para>
2683d17cd367Smrg
2684d17cd367Smrg<funcsynopsis>
2685d17cd367Smrg<funcprototype>
2686d17cd367Smrg  <funcdef>unsigned long <function> IceLastSentSequenceNumber</function></funcdef>
2687d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2688d17cd367Smrg</funcprototype>
2689d17cd367Smrg</funcsynopsis>
2690d17cd367Smrg
2691d17cd367Smrg
2692d17cd367Smrg<para><function>IceLastSentSequenceNumber</function>
2693d17cd367Smrgreturns the sequence number of the last message sent on this ICE connection.</para>
2694d17cd367Smrg
2695d17cd367Smrg<funcsynopsis>
2696d17cd367Smrg<funcprototype>
2697d17cd367Smrg  <funcdef>unsigned long <function> IceLastReceivedSequenceNumber</function></funcdef>
2698d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2699d17cd367Smrg</funcprototype>
2700d17cd367Smrg</funcsynopsis>
2701d17cd367Smrg
2702d17cd367Smrg<para><function>IceLastReceivedSequenceNumber</function>
2703d17cd367Smrgreturns the sequence number of the last message received on this
2704d17cd367SmrgICE connection.</para>
2705d17cd367Smrg
2706d17cd367Smrg<funcsynopsis>
2707d17cd367Smrg<funcprototype>
2708d17cd367Smrg  <funcdef>Bool <function> IceSwapping</function></funcdef>
2709d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2710d17cd367Smrg</funcprototype>
2711d17cd367Smrg</funcsynopsis>
2712d17cd367Smrg
2713d17cd367Smrg
2714d17cd367Smrg<para><function>IceSwapping</function>
2715d17cd367Smrgreturns
2716d17cd367Smrg<function>True</function>
2717d17cd367Smrgif byte swapping is necessary when reading messages on the ICE connection.</para>
2718d17cd367Smrg
2719d17cd367Smrg<funcsynopsis>
2720d17cd367Smrg<funcprototype>
2721d17cd367Smrg  <funcdef>IcePointer <function> IceGetContext</function></funcdef>
2722d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2723d17cd367Smrg</funcprototype>
2724d17cd367Smrg</funcsynopsis>
2725d17cd367Smrg
2726d17cd367Smrg<para><function>IceGetContext</function>
2727d17cd367Smrgreturns the context associated with a connection created by
2728d17cd367Smrg<function>IceOpenConnection</function></para>
2729d17cd367Smrg</chapter>
2730d17cd367Smrg
2731d17cd367Smrg<chapter id='ice_messages'>
2732d17cd367Smrg<title>ICE Messages</title>
2733d17cd367Smrg
2734d17cd367Smrg<para>
2735d17cd367SmrgAll ICE messages have a standard 8-byte header.  The ICElib macros that
2736d17cd367Smrgread and write messages rely on the following naming convention for message
2737d17cd367Smrgheaders:
2738d17cd367Smrg</para>
2739d17cd367Smrg
2740d17cd367Smrg<literallayout class='monospaced'>
2741d17cd367Smrg     CARD8	major_opcode;
2742d17cd367Smrg     CARD8	minor_opcode;
2743d17cd367Smrg     CARD8	data[2];
2744d17cd367Smrg     CARD32	length B32;
2745d17cd367Smrg</literallayout>
2746d17cd367Smrg
2747d17cd367Smrg<para>
2748d17cd367SmrgThe 3rd and 4th bytes of the message header can be used as needed.
2749d17cd367SmrgThe length field is specified in units of 8 bytes.
2750d17cd367Smrg</para>
2751d17cd367Smrg
2752d17cd367Smrg<sect1 id='sending_ice_messages'>
2753d17cd367Smrg<title>Sending ICE Messages</title>
2754d17cd367Smrg
2755d17cd367Smrg<para>
2756d17cd367SmrgThe ICE library maintains an output buffer used for generating messages.
2757d17cd367SmrgProtocol libraries layered on top of ICE may choose to batch messages
2758d17cd367Smrgtogether and flush the output buffer at appropriate times.
2759d17cd367Smrg</para>
2760d17cd367Smrg
2761d17cd367Smrg<para>
2762d17cd367SmrgIf an IO error has occurred on an ICE connection, all write operations
2763d17cd367Smrgwill be ignored.  For further information, see
2764d17cd367Smrg<link linkend="error_handling">
2765d17cd367Smrg<xref linkend="error_handling"></xref></link>.
2766d17cd367Smrg</para>
2767d17cd367Smrg
2768d17cd367Smrg
2769d17cd367Smrg<para>
2770d17cd367SmrgTo get the size of the ICE output buffer, use
2771d17cd367Smrg<function>IceGetOutBufSize</function>
2772d17cd367Smrg</para>
2773d17cd367Smrg
2774d17cd367Smrg<funcsynopsis>
2775d17cd367Smrg<funcprototype>
2776d17cd367Smrg  <funcdef>int <function> IceGetOutBufSize</function></funcdef>
2777d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2778d17cd367Smrg</funcprototype>
2779d17cd367Smrg</funcsynopsis>
2780d17cd367Smrg
2781d17cd367Smrg<variablelist remap='IP'>
2782d17cd367Smrg  <varlistentry>
2783d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2784d17cd367Smrg    <listitem>
2785d17cd367Smrg      <para>A valid ICE connection object.</para>
2786d17cd367Smrg    </listitem>
2787d17cd367Smrg  </varlistentry>
2788d17cd367Smrg</variablelist>
2789d17cd367Smrg
2790d17cd367Smrg
2791d17cd367Smrg<para>
2792d17cd367SmrgTo flush the ICE output buffer, use <function>IceFlush</function>
2793d17cd367Smrg</para>
2794d17cd367Smrg
2795d17cd367Smrg<funcsynopsis>
2796d17cd367Smrg<funcprototype>
2797d17cd367Smrg  <funcdef>int <function> IceFlush</function></funcdef>
2798d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2799d17cd367Smrg</funcprototype>
2800d17cd367Smrg</funcsynopsis>
2801d17cd367Smrg
2802d17cd367Smrg<variablelist remap='IP'>
2803d17cd367Smrg  <varlistentry>
2804d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2805d17cd367Smrg    <listitem>
2806d17cd367Smrg      <para>A valid ICE connection object.</para>
2807d17cd367Smrg    </listitem>
2808d17cd367Smrg  </varlistentry>
2809d17cd367Smrg</variablelist>
2810d17cd367Smrg
2811d17cd367Smrg<para>
2812d17cd367SmrgNote that the output buffer may be implicitly flushed if there is
2813d17cd367Smrginsufficient space to generate a message.
2814d17cd367Smrg</para>
2815d17cd367Smrg
2816d17cd367Smrg<para>The following macros can be used to generate ICE messages:</para>
2817d17cd367Smrg
2818d17cd367Smrg<funcsynopsis>
2819d17cd367Smrg<funcprototype>
2820d17cd367Smrg  <funcdef><function> IceGetHeader</function></funcdef>
2821d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2822d17cd367Smrg    <paramdef>int<parameter> major_opcode</parameter></paramdef>
2823d17cd367Smrg    <paramdef>int<parameter> minor_opcode</parameter></paramdef>
2824d17cd367Smrg    <paramdef>int<parameter> header_size</parameter></paramdef>
2825d17cd367Smrg    <paramdef>&lt;C_data_type&gt;<parameter> *pmsg</parameter></paramdef>
2826d17cd367Smrg</funcprototype>
2827d17cd367Smrg</funcsynopsis>
2828d17cd367Smrg
2829d17cd367Smrg<variablelist remap='IP'>
2830d17cd367Smrg  <varlistentry>
2831d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2832d17cd367Smrg    <listitem>
2833d17cd367Smrg      <para>A valid ICE connection object.</para>
2834d17cd367Smrg    </listitem>
2835d17cd367Smrg  </varlistentry>
2836d17cd367Smrg  <varlistentry>
2837d17cd367Smrg    <term><emphasis remap='I'>major_opcode</emphasis></term>
2838d17cd367Smrg    <listitem>
2839d17cd367Smrg      <para>The major opcode of the message.</para>
2840d17cd367Smrg    </listitem>
2841d17cd367Smrg  </varlistentry>
2842d17cd367Smrg  <varlistentry>
2843d17cd367Smrg    <term><emphasis remap='I'>minor_opcode</emphasis></term>
2844d17cd367Smrg    <listitem>
2845d17cd367Smrg      <para>The minor opcode of the message.</para>
2846d17cd367Smrg    </listitem>
2847d17cd367Smrg  </varlistentry>
2848d17cd367Smrg  <varlistentry>
2849d17cd367Smrg    <term><emphasis remap='I'>header_size</emphasis></term>
2850d17cd367Smrg    <listitem>
2851d17cd367Smrg      <para>The size of the message header (in bytes).</para>
2852d17cd367Smrg    </listitem>
2853d17cd367Smrg  </varlistentry>
2854d17cd367Smrg  <varlistentry>
2855d17cd367Smrg    <term><emphasis remap='I'>&lt;C_data_type&gt;</emphasis></term>
2856d17cd367Smrg    <listitem>
2857d17cd367Smrg      <para>The actual C data type of the message header.</para>
2858d17cd367Smrg    </listitem>
2859d17cd367Smrg  </varlistentry>
2860d17cd367Smrg  <varlistentry>
2861d17cd367Smrg    <term><emphasis remap='I'>pmsg</emphasis></term>
2862d17cd367Smrg    <listitem>
2863d17cd367Smrg      <para>
2864d17cd367SmrgThe message header pointer.  After this macro is called, the
2865d17cd367Smrglibrary can store data in the message header.
2866d17cd367Smrg      </para>
2867d17cd367Smrg    </listitem>
2868d17cd367Smrg  </varlistentry>
2869d17cd367Smrg</variablelist>
2870d17cd367Smrg
2871d17cd367Smrg
2872d17cd367Smrg<para>
2873d17cd367Smrg<function>IceGetHeader</function>
2874d17cd367Smrgis used to set up a message header on an ICE connection.
2875d17cd367SmrgIt sets the major and minor opcodes of the message, and initializes
2876d17cd367Smrgthe message's length to the length of the header.  If additional
2877d17cd367Smrgvariable length data follows, the message's length field should be
2878d17cd367Smrgupdated.
2879d17cd367Smrg</para>
2880d17cd367Smrg
2881d17cd367Smrg
2882d17cd367Smrg<funcsynopsis>
2883d17cd367Smrg<funcprototype>
2884d17cd367Smrg  <funcdef><function> IceGetHeaderExtra</function></funcdef>
2885d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2886d17cd367Smrg    <paramdef>int<parameter> major_opcode</parameter></paramdef>
2887d17cd367Smrg    <paramdef>int<parameter> minor_opcode</parameter></paramdef>
2888d17cd367Smrg    <paramdef>int<parameter> header_size</parameter></paramdef>
2889d17cd367Smrg    <paramdef>int<parameter> extra</parameter></paramdef>
2890d17cd367Smrg    <paramdef>&lt;C_data_type&gt;<parameter> *pmsg</parameter></paramdef>
2891d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
2892d17cd367Smrg</funcprototype>
2893d17cd367Smrg</funcsynopsis>
2894d17cd367Smrg
2895d17cd367Smrg<variablelist remap='IP'>
2896d17cd367Smrg  <varlistentry>
2897d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2898d17cd367Smrg    <listitem>
2899d17cd367Smrg      <para>A valid ICE connection object.</para>
2900d17cd367Smrg    </listitem>
2901d17cd367Smrg  </varlistentry>
2902d17cd367Smrg  <varlistentry>
2903d17cd367Smrg    <term><emphasis remap='I'>major_opcode</emphasis></term>
2904d17cd367Smrg    <listitem>
2905d17cd367Smrg      <para>The major opcode of the message.</para>
2906d17cd367Smrg    </listitem>
2907d17cd367Smrg  </varlistentry>
2908d17cd367Smrg  <varlistentry>
2909d17cd367Smrg    <term><emphasis remap='I'>minor_opcode</emphasis></term>
2910d17cd367Smrg    <listitem>
2911d17cd367Smrg      <para>The minor opcode of the message.</para>
2912d17cd367Smrg    </listitem>
2913d17cd367Smrg  </varlistentry>
2914d17cd367Smrg  <varlistentry>
2915d17cd367Smrg    <term><emphasis remap='I'>header_size</emphasis></term>
2916d17cd367Smrg    <listitem>
2917d17cd367Smrg      <para>The size of the message header (in bytes).</para>
2918d17cd367Smrg    </listitem>
2919d17cd367Smrg  </varlistentry>
2920d17cd367Smrg  <varlistentry>
2921d17cd367Smrg    <term><emphasis remap='I'>extra</emphasis></term>
2922d17cd367Smrg    <listitem>
2923d17cd367Smrg      <para>
2924d17cd367SmrgThe size of the extra data beyond the header (in 8-byte units).
2925d17cd367Smrg      </para>
2926d17cd367Smrg    </listitem>
2927d17cd367Smrg  </varlistentry>
2928d17cd367Smrg  <varlistentry>
2929d17cd367Smrg    <term><emphasis remap='I'>&lt;C_data_type&gt;</emphasis></term>
2930d17cd367Smrg    <listitem>
2931d17cd367Smrg      <para>The actual C data type of the message header.</para>
2932d17cd367Smrg    </listitem>
2933d17cd367Smrg  </varlistentry>
2934d17cd367Smrg  <varlistentry>
2935d17cd367Smrg    <term><emphasis remap='I'>pmsg</emphasis></term>
2936d17cd367Smrg    <listitem>
2937d17cd367Smrg      <para>
2938d17cd367SmrgThe message header pointer.  After this macro is called, the
2939d17cd367Smrglibrary can store data in the message header.
2940d17cd367Smrg      </para>
2941d17cd367Smrg    </listitem>
2942d17cd367Smrg  </varlistentry>
2943d17cd367Smrg  <varlistentry>
2944d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
2945d17cd367Smrg    <listitem>
2946d17cd367Smrg      <para>
2947d17cd367SmrgReturns a pointer to the ICE output buffer that points
2948d17cd367Smrgimmediately after the message header.  The variable length
2949d17cd367Smrgdata should be stored here.  If there was not enough room
2950d17cd367Smrgin the ICE output buffer, pdata is set to NULL.
2951d17cd367Smrg      </para>
2952d17cd367Smrg    </listitem>
2953d17cd367Smrg  </varlistentry>
2954d17cd367Smrg</variablelist>
2955d17cd367Smrg
2956d17cd367Smrg
2957d17cd367Smrg<para>
2958d17cd367Smrg<function>IceGetHeaderExtra</function>
2959d17cd367Smrgis used to generate a message with a fixed (and relatively small) amount
2960d17cd367Smrgof variable length data.  The complete message must fit in the ICE output
2961d17cd367Smrgbuffer.
2962d17cd367Smrg</para>
2963d17cd367Smrg
2964d17cd367Smrg<funcsynopsis>
2965d17cd367Smrg<funcprototype>
2966d17cd367Smrg  <funcdef><function> IceSimpleMessage</function></funcdef>
2967d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
2968d17cd367Smrg    <paramdef>int<parameter> major_opcode</parameter></paramdef>
2969d17cd367Smrg    <paramdef>int<parameter> minor_opcode</parameter></paramdef>
2970d17cd367Smrg</funcprototype>
2971d17cd367Smrg</funcsynopsis>
2972d17cd367Smrg
2973d17cd367Smrg<variablelist remap='IP'>
2974d17cd367Smrg  <varlistentry>
2975d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
2976d17cd367Smrg    <listitem>
2977d17cd367Smrg      <para>A valid ICE connection object.</para>
2978d17cd367Smrg    </listitem>
2979d17cd367Smrg  </varlistentry>
2980d17cd367Smrg  <varlistentry>
2981d17cd367Smrg    <term><emphasis remap='I'>major_opcode</emphasis></term>
2982d17cd367Smrg    <listitem>
2983d17cd367Smrg      <para>The major opcode of the message.</para>
2984d17cd367Smrg    </listitem>
2985d17cd367Smrg  </varlistentry>
2986d17cd367Smrg  <varlistentry>
2987d17cd367Smrg    <term><emphasis remap='I'>minor_opcode</emphasis></term>
2988d17cd367Smrg    <listitem>
2989d17cd367Smrg      <para>The minor opcode of the message.</para>
2990d17cd367Smrg    </listitem>
2991d17cd367Smrg  </varlistentry>
2992d17cd367Smrg</variablelist>
2993d17cd367Smrg
2994d17cd367Smrg<para>
2995d17cd367Smrg<function>IceSimpleMessage</function>
2996d17cd367Smrgis used to generate a message that is identical
2997d17cd367Smrgin size to the ICE header message, and has no additional data.
2998d17cd367Smrg</para>
2999d17cd367Smrg
3000d17cd367Smrg<funcsynopsis>
3001d17cd367Smrg<funcprototype>
3002d17cd367Smrg  <funcdef><function> IceErrorHeader</function></funcdef>
3003d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3004d17cd367Smrg    <paramdef>int<parameter> offending_major_opcode</parameter></paramdef>
3005d17cd367Smrg    <paramdef>int<parameter> offending_minor_opcode</parameter></paramdef>
3006d17cd367Smrg    <paramdef>int<parameter> offending_sequence_num</parameter></paramdef>
3007d17cd367Smrg    <paramdef>int<parameter> severity</parameter></paramdef>
3008d17cd367Smrg    <paramdef>int<parameter> error_class</parameter></paramdef>
3009d17cd367Smrg    <paramdef>int<parameter> data_length</parameter></paramdef>
3010d17cd367Smrg</funcprototype>
3011d17cd367Smrg</funcsynopsis>
3012d17cd367Smrg
3013d17cd367Smrg<variablelist remap='IP'>
3014d17cd367Smrg  <varlistentry>
3015d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3016d17cd367Smrg    <listitem>
3017d17cd367Smrg      <para>A valid ICE connection object.</para>
3018d17cd367Smrg    </listitem>
3019d17cd367Smrg  </varlistentry>
3020d17cd367Smrg  <varlistentry>
3021d17cd367Smrg    <term><emphasis remap='I'>offending_major_opcode</emphasis></term>
3022d17cd367Smrg    <listitem>
3023d17cd367Smrg      <para>
3024d17cd367SmrgThe major opcode of the protocol in which an error was detected.
3025d17cd367Smrg      </para>
3026d17cd367Smrg    </listitem>
3027d17cd367Smrg  </varlistentry>
3028d17cd367Smrg  <varlistentry>
3029d17cd367Smrg    <term><emphasis remap='I'>offending_minor_opcode</emphasis></term>
3030d17cd367Smrg    <listitem>
3031d17cd367Smrg      <para>
3032d17cd367SmrgThe minor opcode of the protocol in which an error was detected.
3033d17cd367Smrg      </para>
3034d17cd367Smrg    </listitem>
3035d17cd367Smrg  </varlistentry>
3036d17cd367Smrg  <varlistentry>
3037d17cd367Smrg    <term><emphasis remap='I'>offending_sequence_num</emphasis></term>
3038d17cd367Smrg    <listitem>
3039d17cd367Smrg      <para>The sequence number of the message that caused the error.</para>
3040d17cd367Smrg    </listitem>
3041d17cd367Smrg  </varlistentry>
3042d17cd367Smrg  <varlistentry>
3043d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis></term>
3044d17cd367Smrg    <listitem>
3045d17cd367Smrg      <para>
3046d17cd367Smrg<function>IceCanContinue</function>
3047d17cd367Smrg<function>IceFatalToProtocol</function>
3048d17cd367Smrgor
3049d17cd367Smrg<function>IceFatalToConnection</function>
3050d17cd367Smrg      </para>
3051d17cd367Smrg    </listitem>
3052d17cd367Smrg  </varlistentry>
3053d17cd367Smrg  <varlistentry>
3054d17cd367Smrg    <term><emphasis remap='I'>error_class</emphasis></term>
3055d17cd367Smrg    <listitem>
3056d17cd367Smrg      <para>The error class.</para>
3057d17cd367Smrg    </listitem>
3058d17cd367Smrg  </varlistentry>
3059d17cd367Smrg  <varlistentry>
3060d17cd367Smrg    <term><emphasis remap='I'>data_length</emphasis></term>
3061d17cd367Smrg    <listitem>
3062d17cd367Smrg      <para>
3063d17cd367SmrgLength of data (in 8-byte units) to be written after the header.
3064d17cd367Smrg      </para>
3065d17cd367Smrg    </listitem>
3066d17cd367Smrg  </varlistentry>
3067d17cd367Smrg</variablelist>
3068d17cd367Smrg
3069d17cd367Smrg<para>
3070d17cd367Smrg<function>IceErrorHeader</function> sets up an error message header.
3071d17cd367Smrg</para>
3072d17cd367Smrg
3073d17cd367Smrg<para>
3074d17cd367SmrgNote that the two clients connected by ICE may be using different
3075d17cd367Smrgmajor opcodes for a given protocol.  The offending_major_opcode passed
3076d17cd367Smrgto this macro is the major opcode of the protocol for the client
3077d17cd367Smrgsending the error message.
3078d17cd367Smrg</para>
3079d17cd367Smrg
3080d17cd367Smrg<para>
3081d17cd367SmrgGeneric errors, which are common to all protocols, have classes
3082d17cd367Smrgin the range 0x8000..0xFFFF.
3083d17cd367SmrgSee the <emphasis remap='I'>Inter-Client Exchange Protocol</emphasis>
3084d17cd367Smrgstandard for more details.
3085d17cd367Smrg</para>
3086d17cd367Smrg
3087d17cd367Smrg<informaltable pgwide='0' frame='none'>
3088d17cd367Smrg  <tgroup cols='2' align='center'>
3089d17cd367Smrg    <colspec colname='c1'/>
3090d17cd367Smrg    <colspec colname='c2'/>
3091d17cd367Smrg    <tbody>
3092d17cd367Smrg      <row>
3093d17cd367Smrg        <entry align='left'>IceBadMinor</entry>
3094d17cd367Smrg        <entry align='left'>0x8000</entry>
3095d17cd367Smrg      </row>
3096d17cd367Smrg      <row>
3097d17cd367Smrg        <entry align='left'>IceBadState</entry>
3098d17cd367Smrg        <entry align='left'>0x8001</entry>
3099d17cd367Smrg      </row>
3100d17cd367Smrg      <row>
3101d17cd367Smrg        <entry align='left'>IceBadLength</entry>
3102d17cd367Smrg        <entry align='left'>0x8002</entry>
3103d17cd367Smrg      </row>
3104d17cd367Smrg      <row>
3105d17cd367Smrg        <entry align='left'>IceBadValue</entry>
3106d17cd367Smrg        <entry align='left'>0x8003</entry>
3107d17cd367Smrg      </row>
3108d17cd367Smrg    </tbody>
3109d17cd367Smrg  </tgroup>
3110d17cd367Smrg</informaltable>
3111d17cd367Smrg
3112d17cd367Smrg<para>Per-protocol errors have classes in the range 0x0000-0x7fff.</para>
3113d17cd367Smrg
3114d17cd367Smrg<para>
3115d17cd367SmrgTo write data to an ICE connection, use the
3116d17cd367Smrg<function>IceWriteData</function> macro.  If the data fits into the
3117d17cd367SmrgICE output buffer, it is copied there.  Otherwise, the ICE output buffer
3118d17cd367Smrgis flushed and the data is directly sent.
3119d17cd367Smrg</para>
3120d17cd367Smrg
3121d17cd367Smrg<para>
3122d17cd367SmrgThis macro is used in conjunction with
3123d17cd367Smrg<function>IceGetHeader</function> and
3124d17cd367Smrg<function>IceErrorHeader</function>
3125d17cd367Smrg</para>
3126d17cd367Smrg
3127d17cd367Smrg<funcsynopsis>
3128d17cd367Smrg<funcprototype>
3129d17cd367Smrg  <funcdef><function> IceWriteData</function></funcdef>
3130d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3131d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3132d17cd367Smrg    <paramdef>char<parameter> *data</parameter></paramdef>
3133d17cd367Smrg</funcprototype>
3134d17cd367Smrg</funcsynopsis>
3135d17cd367Smrg
3136d17cd367Smrg<variablelist remap='IP'>
3137d17cd367Smrg  <varlistentry>
3138d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3139d17cd367Smrg    <listitem>
3140d17cd367Smrg      <para>A valid ICE connection object.</para>
3141d17cd367Smrg    </listitem>
3142d17cd367Smrg  </varlistentry>
3143d17cd367Smrg  <varlistentry>
3144d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3145d17cd367Smrg    <listitem>
3146d17cd367Smrg      <para>The number of bytes to write.</para>
3147d17cd367Smrg    </listitem>
3148d17cd367Smrg  </varlistentry>
3149d17cd367Smrg  <varlistentry>
3150d17cd367Smrg    <term><emphasis remap='I'>data</emphasis></term>
3151d17cd367Smrg    <listitem>
3152d17cd367Smrg      <para>The data to write.</para>
3153d17cd367Smrg    </listitem>
3154d17cd367Smrg  </varlistentry>
3155d17cd367Smrg</variablelist>
3156d17cd367Smrg
3157d17cd367Smrg
3158d17cd367Smrg<para>
3159d17cd367SmrgTo write data as 16-bit quantities, use <function>IceWriteData16</function>
3160d17cd367Smrg</para>
3161d17cd367Smrg
3162d17cd367Smrg<funcsynopsis>
3163d17cd367Smrg<funcprototype>
3164d17cd367Smrg  <funcdef><function> IceWriteData16</function></funcdef>
3165d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3166d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3167d17cd367Smrg    <paramdef>char<parameter> *data</parameter></paramdef>
3168d17cd367Smrg</funcprototype>
3169d17cd367Smrg</funcsynopsis>
3170d17cd367Smrg
3171d17cd367Smrg<variablelist remap='IP'>
3172d17cd367Smrg  <varlistentry>
3173d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3174d17cd367Smrg    <listitem>
3175d17cd367Smrg      <para>A valid ICE connection object.</para>
3176d17cd367Smrg    </listitem>
3177d17cd367Smrg  </varlistentry>
3178d17cd367Smrg  <varlistentry>
3179d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3180d17cd367Smrg    <listitem>
3181d17cd367Smrg      <para>The number of bytes to write.</para>
3182d17cd367Smrg    </listitem>
3183d17cd367Smrg  </varlistentry>
3184d17cd367Smrg  <varlistentry>
3185d17cd367Smrg    <term><emphasis remap='I'>data</emphasis></term>
3186d17cd367Smrg    <listitem>
3187d17cd367Smrg      <para>The data to write.</para>
3188d17cd367Smrg    </listitem>
3189d17cd367Smrg  </varlistentry>
3190d17cd367Smrg</variablelist>
3191d17cd367Smrg
3192d17cd367Smrg<para>
3193d17cd367SmrgTo write data as 32-bit quantities, use <function>IceWriteData32</function>
3194d17cd367Smrg</para>
3195d17cd367Smrg
3196d17cd367Smrg
3197d17cd367Smrg<funcsynopsis>
3198d17cd367Smrg<funcprototype>
3199d17cd367Smrg  <funcdef><function> IceWriteData32</function></funcdef>
3200d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3201d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3202d17cd367Smrg    <paramdef>char<parameter> *data</parameter></paramdef>
3203d17cd367Smrg</funcprototype>
3204d17cd367Smrg</funcsynopsis>
3205d17cd367Smrg
3206d17cd367Smrg<variablelist remap='IP'>
3207d17cd367Smrg  <varlistentry>
3208d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3209d17cd367Smrg    <listitem>
3210d17cd367Smrg      <para>A valid ICE connection object.</para>
3211d17cd367Smrg    </listitem>
3212d17cd367Smrg  </varlistentry>
3213d17cd367Smrg  <varlistentry>
3214d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3215d17cd367Smrg    <listitem>
3216d17cd367Smrg      <para>The number of bytes to write.</para>
3217d17cd367Smrg    </listitem>
3218d17cd367Smrg  </varlistentry>
3219d17cd367Smrg  <varlistentry>
3220d17cd367Smrg    <term><emphasis remap='I'>data</emphasis></term>
3221d17cd367Smrg    <listitem>
3222d17cd367Smrg      <para>The data to write.</para>
3223d17cd367Smrg    </listitem>
3224d17cd367Smrg  </varlistentry>
3225d17cd367Smrg</variablelist>
3226d17cd367Smrg
3227d17cd367Smrg<para>
3228d17cd367SmrgTo write data as 32-bit quantities, use <function>IceWriteData32</function>
3229d17cd367Smrg</para>
3230d17cd367Smrg
3231d17cd367Smrg<para>
3232d17cd367SmrgTo bypass copying data to the ICE output buffer, use
3233d17cd367Smrg<function>IceSendData</function> to directly send data over the network
3234d17cd367Smrgconnection.  If necessary, the ICE output buffer is first flushed.
3235d17cd367Smrg</para>
3236d17cd367Smrg
3237d17cd367Smrg<funcsynopsis>
3238d17cd367Smrg<funcprototype>
3239d17cd367Smrg  <funcdef><function> IceSendData</function></funcdef>
3240d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3241d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3242d17cd367Smrg    <paramdef>char<parameter> *data</parameter></paramdef>
3243d17cd367Smrg</funcprototype>
3244d17cd367Smrg</funcsynopsis>
3245d17cd367Smrg
3246d17cd367Smrg<variablelist remap='IP'>
3247d17cd367Smrg  <varlistentry>
3248d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3249d17cd367Smrg    <listitem>
3250d17cd367Smrg      <para>A valid ICE connection object.</para>
3251d17cd367Smrg    </listitem>
3252d17cd367Smrg  </varlistentry>
3253d17cd367Smrg  <varlistentry>
3254d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3255d17cd367Smrg    <listitem>
3256d17cd367Smrg      <para>The number of bytes to send.</para>
3257d17cd367Smrg    </listitem>
3258d17cd367Smrg  </varlistentry>
3259d17cd367Smrg  <varlistentry>
3260d17cd367Smrg    <term><emphasis remap='I'>data</emphasis></term>
3261d17cd367Smrg    <listitem>
3262d17cd367Smrg      <para>The data to send.</para>
3263d17cd367Smrg    </listitem>
3264d17cd367Smrg  </varlistentry>
3265d17cd367Smrg</variablelist>
3266d17cd367Smrg
3267d17cd367Smrg
3268d17cd367Smrg<para>
3269d17cd367SmrgTo force 32-bit or 64-bit alignment, use <function>IceWritePad</function>
3270d17cd367SmrgA maximum of 7 pad bytes can be specified.
3271d17cd367Smrg</para>
3272d17cd367Smrg
3273d17cd367Smrg<funcsynopsis>
3274d17cd367Smrg<funcprototype>
3275d17cd367Smrg  <funcdef><function> IceWritePad</function></funcdef>
3276d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3277d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3278d17cd367Smrg    <paramdef>char<parameter> *data</parameter></paramdef>
3279d17cd367Smrg</funcprototype>
3280d17cd367Smrg</funcsynopsis>
3281d17cd367Smrg
3282d17cd367Smrg<variablelist remap='IP'>
3283d17cd367Smrg  <varlistentry>
3284d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3285d17cd367Smrg    <listitem>
3286d17cd367Smrg      <para>A valid ICE connection object.</para>
3287d17cd367Smrg    </listitem>
3288d17cd367Smrg  </varlistentry>
3289d17cd367Smrg  <varlistentry>
3290d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3291d17cd367Smrg    <listitem>
3292d17cd367Smrg      <para>The number of bytes to write.</para>
3293d17cd367Smrg    </listitem>
3294d17cd367Smrg  </varlistentry>
3295d17cd367Smrg  <varlistentry>
3296d17cd367Smrg    <term><emphasis remap='I'>data</emphasis></term>
3297d17cd367Smrg    <listitem>
3298d17cd367Smrg      <para>The number of pad bytes to write.</para>
3299d17cd367Smrg    </listitem>
3300d17cd367Smrg  </varlistentry>
3301d17cd367Smrg</variablelist>
3302d17cd367Smrg
3303d17cd367Smrg</sect1>
3304d17cd367Smrg
3305d17cd367Smrg<sect1 id='reading_ice_messages'>
3306d17cd367Smrg<title>Reading ICE Messages</title>
3307d17cd367Smrg
3308d17cd367Smrg
3309d17cd367Smrg<para>
3310d17cd367SmrgThe ICE library maintains an input buffer used for reading messages.
3311d17cd367SmrgIf the ICE library chooses to perform nonblocking reads (this is
3312d17cd367Smrgimplementation-dependent), then for every read operation that it makes,
3313d17cd367Smrgzero or more complete messages may be read into the input buffer.  As
3314d17cd367Smrga result, for all of the macros described in this section that read
3315d17cd367Smrgmessages, an actual read operation will occur on the connection only if
3316d17cd367Smrgthe data is not already present in the input buffer.
3317d17cd367Smrg</para>
3318d17cd367Smrg
3319d17cd367Smrg
3320d17cd367Smrg<para>
3321d17cd367SmrgTo get the size of the ICE input buffer, use
3322d17cd367Smrg<function>IceGetInBufSize</function>
3323d17cd367Smrg</para>
3324d17cd367Smrg
3325d17cd367Smrg<funcsynopsis>
3326d17cd367Smrg<funcprototype>
3327d17cd367Smrg  <funcdef>int<function> IceGetInBufSize</function></funcdef>
3328d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3329d17cd367Smrg</funcprototype>
3330d17cd367Smrg</funcsynopsis>
3331d17cd367Smrg
3332d17cd367Smrg<variablelist remap='IP'>
3333d17cd367Smrg  <varlistentry>
3334d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3335d17cd367Smrg    <listitem>
3336d17cd367Smrg      <para>A valid ICE connection object.</para>
3337d17cd367Smrg    </listitem>
3338d17cd367Smrg  </varlistentry>
3339d17cd367Smrg</variablelist>
3340d17cd367Smrg
3341d17cd367Smrg<para>
3342d17cd367SmrgWhen reading messages, care must be taken to check for IO errors.  If
3343d17cd367Smrgany IO error occurs in reading any part of a message, the message should
3344d17cd367Smrgbe thrown out.  After using any of the macros described below for reading
3345d17cd367Smrgmessages, the <function>IceValidIO</function>
3346d17cd367Smrgmacro can be used to check if an IO error occurred on the
3347d17cd367Smrgconnection.  After an IO error has occurred on an ICE connection, all
3348d17cd367Smrgread operations will be ignored.  For further information, see
3349d17cd367Smrg<link linkend="error_handling">
3350d17cd367Smrg<xref linkend="error_handling"></xref></link>.
3351d17cd367Smrg</para>
3352d17cd367Smrg
3353d17cd367Smrg
3354d17cd367Smrg<funcsynopsis>
3355d17cd367Smrg<funcprototype>
3356d17cd367Smrg  <funcdef>Bool<function> IceValidIO</function></funcdef>
3357d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3358d17cd367Smrg</funcprototype>
3359d17cd367Smrg</funcsynopsis>
3360d17cd367Smrg
3361d17cd367Smrg<variablelist remap='IP'>
3362d17cd367Smrg  <varlistentry>
3363d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3364d17cd367Smrg    <listitem>
3365d17cd367Smrg      <para>A valid ICE connection object.</para>
3366d17cd367Smrg    </listitem>
3367d17cd367Smrg  </varlistentry>
3368d17cd367Smrg</variablelist>
3369d17cd367Smrg
3370d17cd367Smrg<para>The following macros can be used to read ICE messages.</para>
3371d17cd367Smrg
3372d17cd367Smrg<funcsynopsis>
3373d17cd367Smrg<funcprototype>
3374d17cd367Smrg  <funcdef><function> IceReadSimpleMessage</function></funcdef>
3375d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3376d17cd367Smrg    <paramdef>&lt;C_data_type&gt;<parameter> *pmsg</parameter></paramdef>
3377d17cd367Smrg</funcprototype>
3378d17cd367Smrg</funcsynopsis>
3379d17cd367Smrg
3380d17cd367Smrg<variablelist remap='IP'>
3381d17cd367Smrg  <varlistentry>
3382d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3383d17cd367Smrg    <listitem>
3384d17cd367Smrg      <para>A valid ICE connection object.</para>
3385d17cd367Smrg    </listitem>
3386d17cd367Smrg  </varlistentry>
3387d17cd367Smrg  <varlistentry>
3388d17cd367Smrg    <term><emphasis remap='I'>&lt;C_data_type&gt;</emphasis></term>
3389d17cd367Smrg    <listitem>
3390d17cd367Smrg      <para>The actual C data type of the message header.</para>
3391d17cd367Smrg    </listitem>
3392d17cd367Smrg  </varlistentry>
3393d17cd367Smrg  <varlistentry>
3394d17cd367Smrg    <term><emphasis remap='I'>pmsg</emphasis></term>
3395d17cd367Smrg    <listitem>
3396d17cd367Smrg      <para>This pointer is set to the message header.</para>
3397d17cd367Smrg    </listitem>
3398d17cd367Smrg  </varlistentry>
3399d17cd367Smrg</variablelist>
3400d17cd367Smrg
3401d17cd367Smrg<para>
3402d17cd367Smrg<function>IceReadSimpleMessage</function>
3403d17cd367Smrgis used for messages that are identical in size to the 8-byte ICE header, but
3404d17cd367Smrguse the spare 2 bytes in the header to encode additional data.  Note that the
3405d17cd367SmrgICE library always reads in these first 8 bytes, so it can obtain the major
3406d17cd367Smrgopcode of the message.  <function>IceReadSimpleMessage</function>
3407d17cd367Smrgsimply returns a pointer to these 8 bytes; it does not actually read any data
3408d17cd367Smrginto the input buffer.
3409d17cd367Smrg</para>
3410d17cd367Smrg
3411d17cd367Smrg<para>
3412d17cd367SmrgFor a message with variable length data, there are two ways of reading
3413d17cd367Smrgthe message.  One method involves reading the complete message in one
3414d17cd367Smrgpass using <function>IceReadCompleteMessage</function>
3415d17cd367SmrgThe second method involves reading the message header (note that this may
3416d17cd367Smrgbe larger than the 8-byte ICE header), then reading
3417d17cd367Smrgthe variable length data in chunks (see
3418d17cd367Smrg<function>IceReadMessageHeader</function> and
3419d17cd367Smrg<function>IceReadData</function>
3420d17cd367Smrg</para>
3421d17cd367Smrg
3422d17cd367Smrg
3423d17cd367Smrg<funcsynopsis>
3424d17cd367Smrg<funcprototype>
3425d17cd367Smrg  <funcdef><function> IceReadCompleteMessage</function></funcdef>
3426d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3427d17cd367Smrg    <paramdef>int<parameter> header_size</parameter></paramdef>
3428d17cd367Smrg    <paramdef>&lt;C_data_type&gt;<parameter> *pmsg</parameter></paramdef>
3429d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
3430d17cd367Smrg</funcprototype>
3431d17cd367Smrg</funcsynopsis>
3432d17cd367Smrg
3433d17cd367Smrg<variablelist remap='IP'>
3434d17cd367Smrg  <varlistentry>
3435d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3436d17cd367Smrg    <listitem>
3437d17cd367Smrg      <para>A valid ICE connection object.</para>
3438d17cd367Smrg    </listitem>
3439d17cd367Smrg  </varlistentry>
3440d17cd367Smrg  <varlistentry>
3441d17cd367Smrg    <term><emphasis remap='I'>header_size</emphasis></term>
3442d17cd367Smrg    <listitem>
3443d17cd367Smrg      <para>The size of the message header (in bytes).</para>
3444d17cd367Smrg    </listitem>
3445d17cd367Smrg  </varlistentry>
3446d17cd367Smrg  <varlistentry>
3447d17cd367Smrg    <term><emphasis remap='I'>&lt;C_data_type&gt;</emphasis></term>
3448d17cd367Smrg    <listitem>
3449d17cd367Smrg      <para>The actual C data type of the message header.</para>
3450d17cd367Smrg    </listitem>
3451d17cd367Smrg  </varlistentry>
3452d17cd367Smrg  <varlistentry>
3453d17cd367Smrg    <term><emphasis remap='I'>pmsg</emphasis></term>
3454d17cd367Smrg    <listitem>
3455d17cd367Smrg      <para>This pointer is set to the message header.</para>
3456d17cd367Smrg    </listitem>
3457d17cd367Smrg  </varlistentry>
3458d17cd367Smrg  <varlistentry>
3459d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
3460d17cd367Smrg    <listitem>
3461d17cd367Smrg      <para>
3462d17cd367SmrgThis pointer is set to the variable length data of the message.
3463d17cd367Smrg      </para>
3464d17cd367Smrg    </listitem>
3465d17cd367Smrg  </varlistentry>
3466d17cd367Smrg</variablelist>
3467d17cd367Smrg
3468d17cd367Smrg<para>
3469d17cd367SmrgIf the ICE input buffer has sufficient space,
3470d17cd367Smrg<function>IceReadCompleteMessage</function>
3471d17cd367Smrgwill read the complete message into the
3472d17cd367SmrgICE input buffer.  Otherwise, a buffer will be allocated to hold the
3473d17cd367Smrgvariable length data.  After the call, the pdata argument should
3474d17cd367Smrgbe checked against NULL to make sure that there was sufficient memory
3475d17cd367Smrgto allocate the buffer.
3476d17cd367Smrg</para>
3477d17cd367Smrg
3478d17cd367Smrg<para>
3479d17cd367SmrgAfter calling <function>IceReadCompleteMessage</function>
3480d17cd367Smrgand processing the message, <function>IceDisposeCompleteMessage</function>
3481d17cd367Smrgshould be called.
3482d17cd367Smrg</para>
3483d17cd367Smrg
3484d17cd367Smrg
3485d17cd367Smrg<funcsynopsis>
3486d17cd367Smrg<funcprototype>
3487d17cd367Smrg  <funcdef><function> IceDisposeCompleteMessage</function></funcdef>
3488d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3489d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
3490d17cd367Smrg</funcprototype>
3491d17cd367Smrg</funcsynopsis>
3492d17cd367Smrg
3493d17cd367Smrg<variablelist remap='IP'>
3494d17cd367Smrg  <varlistentry>
3495d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3496d17cd367Smrg    <listitem>
3497d17cd367Smrg      <para>A valid ICE connection object.</para>
3498d17cd367Smrg    </listitem>
3499d17cd367Smrg  </varlistentry>
3500d17cd367Smrg  <varlistentry>
3501d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
3502d17cd367Smrg    <listitem>
3503d17cd367Smrg      <para>
3504d17cd367SmrgThe pointer to the variable length data returned in
3505d17cd367Smrg<function>IceReadCompleteMessage</function>
3506d17cd367Smrg      </para>
3507d17cd367Smrg    </listitem>
3508d17cd367Smrg  </varlistentry>
3509d17cd367Smrg</variablelist>
3510d17cd367Smrg
3511d17cd367Smrg<para>
3512d17cd367SmrgIf a buffer had to be allocated to hold the variable length data (because
3513d17cd367Smrgit did not fit in the ICE input buffer), it is freed here by ICElib.
3514d17cd367Smrg</para>
3515d17cd367Smrg
3516d17cd367Smrg
3517d17cd367Smrg<funcsynopsis>
3518d17cd367Smrg<funcprototype>
3519d17cd367Smrg  <funcdef><function> IceReadMessageHeader</function></funcdef>
3520d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3521d17cd367Smrg    <paramdef>int<parameter> header_size</parameter></paramdef>
3522d17cd367Smrg    <paramdef>&lt;C_data_type&gt;<parameter> *pmsg</parameter></paramdef>
3523d17cd367Smrg</funcprototype>
3524d17cd367Smrg</funcsynopsis>
3525d17cd367Smrg
3526d17cd367Smrg<variablelist remap='IP'>
3527d17cd367Smrg  <varlistentry>
3528d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3529d17cd367Smrg    <listitem>
3530d17cd367Smrg      <para>A valid ICE connection object.</para>
3531d17cd367Smrg    </listitem>
3532d17cd367Smrg  </varlistentry>
3533d17cd367Smrg  <varlistentry>
3534d17cd367Smrg    <term><emphasis remap='I'>header_size</emphasis></term>
3535d17cd367Smrg    <listitem>
3536d17cd367Smrg      <para>The size of the message header (in bytes).</para>
3537d17cd367Smrg    </listitem>
3538d17cd367Smrg  </varlistentry>
3539d17cd367Smrg  <varlistentry>
3540d17cd367Smrg    <term><emphasis remap='I'>&lt;C_data_type&gt;</emphasis></term>
3541d17cd367Smrg    <listitem>
3542d17cd367Smrg      <para>The actual C data type of the message header.</para>
3543d17cd367Smrg    </listitem>
3544d17cd367Smrg  </varlistentry>
3545d17cd367Smrg  <varlistentry>
3546d17cd367Smrg    <term><emphasis remap='I'>pmsg</emphasis></term>
3547d17cd367Smrg    <listitem>
3548d17cd367Smrg      <para>This pointer is set to the message header.</para>
3549d17cd367Smrg    </listitem>
3550d17cd367Smrg  </varlistentry>
3551d17cd367Smrg</variablelist>
3552d17cd367Smrg
3553d17cd367Smrg<para>
3554d17cd367Smrg<function>IceReadMessageHeader</function> reads just the message header.
3555d17cd367SmrgThe rest of the data should be read with the
3556d17cd367Smrg<function>IceReadData</function>
3557d17cd367Smrgfamily of macros.  This method of reading a message should be used when the
3558d17cd367Smrgvariable length data must be read in chunks.
3559d17cd367Smrg</para>
3560d17cd367Smrg
3561d17cd367Smrg
3562d17cd367Smrg<para>
3563d17cd367SmrgTo read data directly into a user supplied buffer, use
3564d17cd367Smrg<function>IceReadData</function>
3565d17cd367Smrg</para>
3566d17cd367Smrg
3567d17cd367Smrg<funcsynopsis>
3568d17cd367Smrg<funcprototype>
3569d17cd367Smrg  <funcdef><function> IceReadData</function></funcdef>
3570d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3571d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3572d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
3573d17cd367Smrg</funcprototype>
3574d17cd367Smrg</funcsynopsis>
3575d17cd367Smrg
3576d17cd367Smrg<variablelist remap='IP'>
3577d17cd367Smrg  <varlistentry>
3578d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3579d17cd367Smrg    <listitem>
3580d17cd367Smrg      <para>A valid ICE connection object.</para>
3581d17cd367Smrg    </listitem>
3582d17cd367Smrg  </varlistentry>
3583d17cd367Smrg  <varlistentry>
3584d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3585d17cd367Smrg    <listitem>
3586d17cd367Smrg      <para>The number of bytes to read.</para>
3587d17cd367Smrg    </listitem>
3588d17cd367Smrg  </varlistentry>
3589d17cd367Smrg  <varlistentry>
3590d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
3591d17cd367Smrg    <listitem>
3592d17cd367Smrg      <para>The data is read into this user supplied buffer.</para>
3593d17cd367Smrg    </listitem>
3594d17cd367Smrg  </varlistentry>
3595d17cd367Smrg</variablelist>
3596d17cd367Smrg
3597d17cd367Smrg
3598d17cd367Smrg<para>
3599d17cd367SmrgTo read data as 16-bit quantities, use <function>IceReadData16</function>
3600d17cd367Smrg</para>
3601d17cd367Smrg
3602d17cd367Smrg<funcsynopsis>
3603d17cd367Smrg<funcprototype>
3604d17cd367Smrg  <funcdef><function> IceReadData16</function></funcdef>
3605d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3606d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
3607d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3608d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
3609d17cd367Smrg</funcprototype>
3610d17cd367Smrg</funcsynopsis>
3611d17cd367Smrg
3612d17cd367Smrg<variablelist remap='IP'>
3613d17cd367Smrg  <varlistentry>
3614d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3615d17cd367Smrg    <listitem>
3616d17cd367Smrg      <para>A valid ICE connection object.</para>
3617d17cd367Smrg    </listitem>
3618d17cd367Smrg  </varlistentry>
3619d17cd367Smrg  <varlistentry>
3620d17cd367Smrg    <term><emphasis remap='I'>swap</emphasis></term>
3621d17cd367Smrg    <listitem>
3622d17cd367Smrg      <para>
3623d17cd367SmrgIf <function>True,</function> the values will be byte swapped.
3624d17cd367Smrg      </para>
3625d17cd367Smrg    </listitem>
3626d17cd367Smrg  </varlistentry>
3627d17cd367Smrg  <varlistentry>
3628d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3629d17cd367Smrg    <listitem>
3630d17cd367Smrg      <para>The number of bytes to read.</para>
3631d17cd367Smrg    </listitem>
3632d17cd367Smrg  </varlistentry>
3633d17cd367Smrg  <varlistentry>
3634d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
3635d17cd367Smrg    <listitem>
3636d17cd367Smrg      <para>The data is read into this user supplied buffer.</para>
3637d17cd367Smrg    </listitem>
3638d17cd367Smrg  </varlistentry>
3639d17cd367Smrg</variablelist>
3640d17cd367Smrg
3641d17cd367Smrg
3642d17cd367Smrg<para>
3643d17cd367SmrgTo read data as 32-bit quantities, use <function>IceReadData32</function>
3644d17cd367Smrg</para>
3645d17cd367Smrg
3646d17cd367Smrg<funcsynopsis>
3647d17cd367Smrg<funcprototype>
3648d17cd367Smrg  <funcdef><function> IceReadData32</function></funcdef>
3649d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3650d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
3651d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3652d17cd367Smrg    <paramdef>char<parameter> *pdata</parameter></paramdef>
3653d17cd367Smrg</funcprototype>
3654d17cd367Smrg</funcsynopsis>
3655d17cd367Smrg
3656d17cd367Smrg<variablelist remap='IP'>
3657d17cd367Smrg  <varlistentry>
3658d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3659d17cd367Smrg    <listitem>
3660d17cd367Smrg      <para>A valid ICE connection object.</para>
3661d17cd367Smrg    </listitem>
3662d17cd367Smrg  </varlistentry>
3663d17cd367Smrg  <varlistentry>
3664d17cd367Smrg    <term><emphasis remap='I'>swap</emphasis></term>
3665d17cd367Smrg    <listitem>
3666d17cd367Smrg      <para>
3667d17cd367SmrgIf <function>True,</function> the values will be byte swapped.
3668d17cd367Smrg      </para>
3669d17cd367Smrg    </listitem>
3670d17cd367Smrg  </varlistentry>
3671d17cd367Smrg  <varlistentry>
3672d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3673d17cd367Smrg    <listitem>
3674d17cd367Smrg      <para>The number of bytes to read.</para>
3675d17cd367Smrg    </listitem>
3676d17cd367Smrg  </varlistentry>
3677d17cd367Smrg  <varlistentry>
3678d17cd367Smrg    <term><emphasis remap='I'>pdata</emphasis></term>
3679d17cd367Smrg    <listitem>
3680d17cd367Smrg      <para>The data is read into this user supplied buffer.</para>
3681d17cd367Smrg    </listitem>
3682d17cd367Smrg  </varlistentry>
3683d17cd367Smrg</variablelist>
3684d17cd367Smrg
3685d17cd367Smrg<para>To force 32-bit or 64-bit alignment, use
3686d17cd367Smrg<function>IceReadPad</function>
3687d17cd367SmrgA maximum of 7 pad bytes can be specified.</para>
3688d17cd367Smrg
3689d17cd367Smrg<funcsynopsis>
3690d17cd367Smrg<funcprototype>
3691d17cd367Smrg  <funcdef><function> IceReadPad</function></funcdef>
3692d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3693d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3694d17cd367Smrg</funcprototype>
3695d17cd367Smrg</funcsynopsis>
3696d17cd367Smrg
3697d17cd367Smrg<variablelist remap='IP'>
3698d17cd367Smrg  <varlistentry>
3699d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3700d17cd367Smrg    <listitem>
3701d17cd367Smrg      <para>A valid ICE connection object.</para>
3702d17cd367Smrg    </listitem>
3703d17cd367Smrg  </varlistentry>
3704d17cd367Smrg  <varlistentry>
3705d17cd367Smrg    <term><emphasis remap='I'>bytes</emphasis></term>
3706d17cd367Smrg    <listitem>
3707d17cd367Smrg      <para>The number of pad bytes.</para>
3708d17cd367Smrg    </listitem>
3709d17cd367Smrg  </varlistentry>
3710d17cd367Smrg</variablelist>
3711d17cd367Smrg
3712d17cd367Smrg</sect1>
3713d17cd367Smrg</chapter>
3714d17cd367Smrg
3715d17cd367Smrg<chapter id='error_handling'>
3716d17cd367Smrg<title>Error Handling</title>
3717d17cd367Smrg
3718d17cd367Smrg
3719d17cd367Smrg<para>There are two default error handlers in ICElib:</para>
3720d17cd367Smrg
3721d17cd367Smrg<itemizedlist>
3722d17cd367Smrg  <listitem>
3723d17cd367Smrg    <para>
3724d17cd367SmrgOne to handle typically fatal conditions (for example,
3725d17cd367Smrga connection dying because a machine crashed)
3726d17cd367Smrg    </para>
3727d17cd367Smrg  </listitem>
3728d17cd367Smrg  <listitem>
3729d17cd367Smrg    <para>One to handle ICE-specific protocol errors</para>
3730d17cd367Smrg  </listitem>
3731d17cd367Smrg</itemizedlist>
3732d17cd367Smrg
3733d17cd367Smrg<para>
3734d17cd367SmrgThese error handlers can be changed to user-supplied routines if you
3735d17cd367Smrgprefer your own error handling and can be changed as often as you like.
3736d17cd367Smrg</para>
3737d17cd367Smrg
3738d17cd367Smrg
3739d17cd367Smrg<para>
3740d17cd367SmrgTo set the ICE error handler, use <function>IceSetErrorHandler</function>
3741d17cd367Smrg</para>
3742d17cd367Smrg
3743d17cd367Smrg<funcsynopsis>
3744d17cd367Smrg<funcprototype>
3745d17cd367Smrg  <funcdef><function> IceSetErrorHandler</function></funcdef>
3746d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3747d17cd367Smrg    <paramdef>int<parameter> bytes</parameter></paramdef>
3748d17cd367Smrg</funcprototype>
3749d17cd367Smrg</funcsynopsis>
3750d17cd367Smrg
3751d17cd367Smrg<variablelist remap='IP'>
3752d17cd367Smrg  <varlistentry>
3753d17cd367Smrg    <term><emphasis remap='I'>handler</emphasis></term>
3754d17cd367Smrg    <listitem>
3755d17cd367Smrg      <para>
3756d17cd367SmrgThe ICE error handler.  You should pass NULL to restore the default handler.
3757d17cd367Smrg      </para>
3758d17cd367Smrg    </listitem>
3759d17cd367Smrg  </varlistentry>
3760d17cd367Smrg</variablelist>
3761d17cd367Smrg
3762d17cd367Smrg<para>
3763d17cd367Smrg<function>IceSetErrorHandler</function> returns the previous error handler.
3764d17cd367Smrg</para>
3765d17cd367Smrg
3766d17cd367Smrg<para>
3767d17cd367SmrgThe ICE error handler is invoked when an unexpected ICE protocol
3768d17cd367Smrgerror (major opcode 0) is encountered.  The action of the default
3769d17cd367Smrghandler is to print an explanatory message to
3770d17cd367Smrg<function>stderr</function>
3771d17cd367Smrgand if the severity is fatal, call
3772d17cd367Smrg<function>exit</function>
3773d17cd367Smrgwith a nonzero value.  If exiting
3774d17cd367Smrgis undesirable, the application should register its own error handler.
3775d17cd367Smrg</para>
3776d17cd367Smrg
3777d17cd367Smrg<para>
3778d17cd367SmrgNote that errors in other protocol
3779d17cd367Smrgdomains should be handled by their respective libraries (these libraries
3780d17cd367Smrgshould have their own error handlers).
3781d17cd367Smrg</para>
3782d17cd367Smrg
3783d17cd367Smrg<para>
3784d17cd367SmrgAn ICE error handler has the type of <function>IceErrorHandler</function>
3785d17cd367Smrg</para>
3786d17cd367Smrg
3787d17cd367Smrg<funcsynopsis>
3788d17cd367Smrg<funcprototype>
3789d17cd367Smrg  <funcdef>void<function> IceErrorHandler</function></funcdef>
3790d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3791d17cd367Smrg    <paramdef>Bool<parameter> swap</parameter></paramdef>
3792d17cd367Smrg    <paramdef>int<parameter> offending_minor_opcode</parameter></paramdef>
3793d17cd367Smrg    <paramdef>unsigned long<parameter> offending_sequence_num</parameter></paramdef>
3794d17cd367Smrg    <paramdef>int<parameter> error_class</parameter></paramdef>
3795d17cd367Smrg    <paramdef>int<parameter> severity</parameter></paramdef>
3796d17cd367Smrg    <paramdef>IcePointer<parameter> values</parameter></paramdef>
3797d17cd367Smrg</funcprototype>
3798d17cd367Smrg</funcsynopsis>
3799d17cd367Smrg
3800d17cd367Smrg<variablelist remap='IP'>
3801d17cd367Smrg  <varlistentry>
3802d17cd367Smrg    <term><emphasis remap='I'>handler</emphasis></term>
3803d17cd367Smrg    <listitem>
3804d17cd367Smrg      <para>The ICE connection object.</para>
3805d17cd367Smrg    </listitem>
3806d17cd367Smrg  </varlistentry>
3807d17cd367Smrg  <varlistentry>
3808d17cd367Smrg    <term><emphasis remap='I'>swap</emphasis></term>
3809d17cd367Smrg    <listitem>
3810d17cd367Smrg      <para>A flag that indicates if the values need byte swapping.</para>
3811d17cd367Smrg    </listitem>
3812d17cd367Smrg  </varlistentry>
3813d17cd367Smrg  <varlistentry>
3814d17cd367Smrg    <term><emphasis remap='I'>offending_minor_opcode</emphasis></term>
3815d17cd367Smrg    <listitem>
3816d17cd367Smrg      <para>The ICE minor opcode of the offending message.</para>
3817d17cd367Smrg    </listitem>
3818d17cd367Smrg  </varlistentry>
3819d17cd367Smrg  <varlistentry>
3820d17cd367Smrg    <term><emphasis remap='I'>offending_sequence_num</emphasis></term>
3821d17cd367Smrg    <listitem>
3822d17cd367Smrg      <para>The sequence number of the offending message.</para>
3823d17cd367Smrg    </listitem>
3824d17cd367Smrg  </varlistentry>
3825d17cd367Smrg  <varlistentry>
3826d17cd367Smrg    <term><emphasis remap='I'>error_class</emphasis></term>
3827d17cd367Smrg    <listitem>
3828d17cd367Smrg      <para>The error class of the offending message.</para>
3829d17cd367Smrg    </listitem>
3830d17cd367Smrg  </varlistentry>
3831d17cd367Smrg  <varlistentry>
3832d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis></term>
3833d17cd367Smrg    <listitem>
3834d17cd367Smrg      <para>
3835d17cd367Smrg<function>IceCanContinue</function>
3836d17cd367Smrg<function>IceFatalToProtocol</function>
3837d17cd367Smrgor
3838d17cd367Smrg<function>IceFatalToConnection</function>
3839d17cd367Smrg      </para>
3840d17cd367Smrg    </listitem>
3841d17cd367Smrg  </varlistentry>
3842d17cd367Smrg  <varlistentry>
3843d17cd367Smrg    <term><emphasis remap='I'>values</emphasis></term>
3844d17cd367Smrg    <listitem>
3845d17cd367Smrg      <para>
3846d17cd367SmrgAny additional error values specific to the minor opcode and class.
3847d17cd367Smrg      </para>
3848d17cd367Smrg    </listitem>
3849d17cd367Smrg  </varlistentry>
3850d17cd367Smrg</variablelist>
3851d17cd367Smrg
3852d17cd367Smrg
3853d17cd367Smrg<para>The following error classes are defined at the ICE level:</para>
3854d17cd367Smrg
3855d17cd367Smrg<literallayout remap='Ds'>
3856d17cd367Smrg<function>IceBadMinor</function>
3857d17cd367Smrg<function>IceBadState</function>
3858d17cd367Smrg<function>IceBadLength</function>
3859d17cd367Smrg<function>IceBadValue</function>
3860d17cd367Smrg<function>IceBadMajor</function>
3861d17cd367Smrg<function>IceNoAuth</function>
3862d17cd367Smrg<function>IceNoVersion</function>
3863d17cd367Smrg<function>IceSetupFailed</function>
3864d17cd367Smrg<function>IceAuthRejected</function>
3865d17cd367Smrg<function>IceAuthFailed</function>
3866d17cd367Smrg<function>IceProtocolDuplicate</function>
3867d17cd367Smrg<function>IceMajorOpcodeDuplicate</function>
3868d17cd367Smrg<function>IceUnknownProtocol</function>
3869d17cd367Smrg</literallayout>
3870d17cd367Smrg
3871d17cd367Smrg<para>
3872d17cd367SmrgFor further information, see
3873d17cd367Smrgthe <emphasis remap='I'>Inter-Client Exchange Protocol</emphasis> standard.
3874d17cd367Smrg</para>
3875d17cd367Smrg
3876d17cd367Smrg
3877d17cd367Smrg<para>
3878d17cd367SmrgTo handle fatal I/O errors, use <function>IceSetIOErrorHandler</function>
3879d17cd367Smrg</para>
3880d17cd367Smrg
3881d17cd367Smrg
3882d17cd367Smrg<funcsynopsis>
3883d17cd367Smrg<funcprototype>
3884d17cd367Smrg  <funcdef>IceIOErrorHandler<function> IceSetIOErrorHandler</function></funcdef>
3885d17cd367Smrg    <paramdef>IceIOErrorHandler<parameter> handler</parameter></paramdef>
3886d17cd367Smrg</funcprototype>
3887d17cd367Smrg</funcsynopsis>
3888d17cd367Smrg
3889d17cd367Smrg<variablelist remap='IP'>
3890d17cd367Smrg  <varlistentry>
3891d17cd367Smrg    <term><emphasis remap='I'>handler</emphasis></term>
3892d17cd367Smrg    <listitem>
3893d17cd367Smrg      <para>
3894d17cd367SmrgThe I/O error handler.  You should pass NULL to restore the default handler.
3895d17cd367Smrg      </para>
3896d17cd367Smrg    </listitem>
3897d17cd367Smrg  </varlistentry>
3898d17cd367Smrg</variablelist>
3899d17cd367Smrg
3900d17cd367Smrg<para>
3901d17cd367Smrg<function>IceSetIOErrorHandler</function> returns the previous
3902d17cd367SmrgIO error handler.
3903d17cd367Smrg</para>
3904d17cd367Smrg
3905d17cd367Smrg<para>
3906d17cd367SmrgAn ICE I/O error handler has the type of
3907d17cd367Smrg<function>IceIOErrorHandler</function>
3908d17cd367Smrg</para>
3909d17cd367Smrg
3910d17cd367Smrg<funcsynopsis>
3911d17cd367Smrg<funcprototype>
3912d17cd367Smrg  <funcdef>void<function> IceIOErrorHandler</function></funcdef>
3913d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3914d17cd367Smrg</funcprototype>
3915d17cd367Smrg</funcsynopsis>
3916d17cd367Smrg
3917d17cd367Smrg<variablelist remap='IP'>
3918d17cd367Smrg  <varlistentry>
3919d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3920d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
3921d17cd367Smrg  </varlistentry>
3922d17cd367Smrg</variablelist>
3923d17cd367Smrg
3924d17cd367Smrg
3925d17cd367Smrg<para> There are two ways of handling IO errors in ICElib:</para>
3926d17cd367Smrg
3927d17cd367Smrg<itemizedlist>
3928d17cd367Smrg  <listitem>
3929d17cd367Smrg    <para>
3930d17cd367SmrgIn the first, the IO error handler does whatever is necessary
3931d17cd367Smrgto respond to the IO error and then returns, but it does not call
3932d17cd367Smrg<function>IceCloseConnection</function>
3933d17cd367SmrgThe ICE connection is given a "bad IO" status, and all future reads
3934d17cd367Smrgand writes to the connection are ignored.  The next time
3935d17cd367Smrg<function>IceProcessMessages</function>
3936d17cd367Smrgis called it will return a status of
3937d17cd367Smrg<function>IceProcessMessagesIOError</function>
3938d17cd367SmrgAt that time, the application should call
3939d17cd367Smrg<function>IceCloseConnection</function>
3940d17cd367Smrg    </para>
3941d17cd367Smrg  </listitem>
3942d17cd367Smrg  <listitem>
3943d17cd367Smrg    <para>
3944d17cd367SmrgIn the second, the IO error handler does call
3945d17cd367Smrg<function>IceCloseConnection</function>
3946d17cd367Smrgand then uses the <function>longjmp</function>
3947d17cd367Smrgcall to get back to the application's main event loop.  The
3948d17cd367Smrg<function>setjmp</function> and
3949d17cd367Smrg<function>longjmp</function>
3950d17cd367Smrgcalls may not work properly on all platforms,
3951d17cd367Smrgand special care must be taken to avoid memory leaks.
3952d17cd367SmrgTherefore, this second model is less desirable.
3953d17cd367Smrg    </para>
3954d17cd367Smrg  </listitem>
3955d17cd367Smrg</itemizedlist>
3956d17cd367Smrg
3957d17cd367Smrg<para>
3958d17cd367SmrgBefore the application I/O error handler is invoked, protocol libraries
3959d17cd367Smrgthat were interested in being notified of I/O errors will have their
3960d17cd367Smrg<function>IceIOErrorProc</function>
3961d17cd367Smrghandlers invoked.  This handler is set up in the protocol registration
3962d17cd367Smrgfunctions (see <function>IceRegisterForProtocolSetup</function> and
3963d17cd367Smrg<function>IceRegisterForProtocolReply</function>
3964d17cd367Smrgand could be used to clean up state specific to the protocol.
3965d17cd367Smrg</para>
3966d17cd367Smrg
3967d17cd367Smrg
3968d17cd367Smrg<funcsynopsis>
3969d17cd367Smrg<funcprototype>
3970d17cd367Smrg  <funcdef>void<function> IceIOErrorProc</function></funcdef>
3971d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
3972d17cd367Smrg</funcprototype>
3973d17cd367Smrg</funcsynopsis>
3974d17cd367Smrg
3975d17cd367Smrg<variablelist remap='IP'>
3976d17cd367Smrg  <varlistentry>
3977d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
3978d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
3979d17cd367Smrg  </varlistentry>
3980d17cd367Smrg</variablelist>
3981d17cd367Smrg
3982d17cd367Smrg<para>
3983d17cd367SmrgNote that every <function>IceIOErrorProc</function>
3984d17cd367Smrgcallback must return.  This is required
3985d17cd367Smrgbecause each active protocol must be notified of the broken connection,
3986d17cd367Smrgand the application IO error handler must be invoked afterwards.
3987d17cd367Smrg</para>
3988d17cd367Smrg</chapter>
3989d17cd367Smrg
3990d17cd367Smrg<chapter id='multithreading_support'>
3991d17cd367Smrg<title>Multi-Threading Support</title>
3992d17cd367Smrg
3993d17cd367Smrg
3994d17cd367Smrg<para>To declare that multiple threads in an application will be using the ICE
3995d17cd367Smrglibrary, use
3996d17cd367Smrg<function>IceInitThreads</function></para>
3997d17cd367Smrg
3998d17cd367Smrg<literallayout remap='FD'>
3999d17cd367SmrgStatus IceInitThreads()
4000d17cd367Smrg</literallayout>
4001d17cd367Smrg
4002d17cd367Smrg
4003d17cd367Smrg<para>The
4004d17cd367Smrg<function>IceInitThreads</function>
4005d17cd367Smrgfunction must be the first ICElib function a
4006d17cd367Smrgmulti-threaded program calls.  It must complete before any other ICElib
4007d17cd367Smrgcall is made.
4008d17cd367Smrg<function>IceInitThreads</function>
4009d17cd367Smrgreturns a nonzero status if and only if it was able
4010d17cd367Smrgto initialize the threads package successfully.
4011d17cd367SmrgIt is safe to call
4012d17cd367Smrg<function>IceInitThreads</function>
4013d17cd367Smrgmore than once, although the threads package will only be initialized once.</para>
4014d17cd367Smrg
4015d17cd367Smrg<para>Protocol libraries layered on top of ICElib will have to lock critical
4016d17cd367Smrgsections of code that access an ICE connection (for example, when
4017d17cd367Smrggenerating messages).  Two calls, which are generally implemented as
4018d17cd367Smrgmacros, are provided:</para>
4019d17cd367Smrg
4020d17cd367Smrg<funcsynopsis>
4021d17cd367Smrg<funcprototype>
4022d17cd367Smrg  <funcdef>void<function> IceLockConn</function></funcdef>
4023d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
4024d17cd367Smrg</funcprototype>
4025d17cd367Smrg</funcsynopsis>
4026d17cd367Smrg
4027d17cd367Smrg<funcsynopsis>
4028d17cd367Smrg<funcprototype>
4029d17cd367Smrg  <funcdef>void<function> IceUnlockConn</function></funcdef>
4030d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
4031d17cd367Smrg</funcprototype>
4032d17cd367Smrg</funcsynopsis>
4033d17cd367Smrg
4034d17cd367Smrg<variablelist remap='IP'>
4035d17cd367Smrg  <varlistentry>
4036d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
4037d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
4038d17cd367Smrg  </varlistentry>
4039d17cd367Smrg</variablelist>
4040d17cd367Smrg
4041d17cd367Smrg<para>To keep an ICE connection locked across several ICElib calls, applications use
4042d17cd367Smrg<function>IceAppLockConn</function>
4043d17cd367Smrgand
4044d17cd367Smrg<function>IceAppUnlockConn</function></para>
4045d17cd367Smrg
4046d17cd367Smrg<funcsynopsis>
4047d17cd367Smrg<funcprototype>
4048d17cd367Smrg  <funcdef>void<function> IceAppLockConn</function></funcdef>
4049d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
4050d17cd367Smrg</funcprototype>
4051d17cd367Smrg</funcsynopsis>
4052d17cd367Smrg
4053d17cd367Smrg<variablelist remap='IP'>
4054d17cd367Smrg  <varlistentry>
4055d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
4056d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
4057d17cd367Smrg  </varlistentry>
4058d17cd367Smrg</variablelist>
4059d17cd367Smrg
4060d17cd367Smrg
4061d17cd367Smrg<para>The
4062d17cd367Smrg<function>IceAppLockConn</function>
4063d17cd367Smrgfunction completely locks out other threads using the connection
4064d17cd367Smrguntil
4065d17cd367Smrg<function>IceAppUnlockConn</function>
4066d17cd367Smrgis called.  Other threads attempting to use ICElib
4067d17cd367Smrgcalls on the connection will block.
4068d17cd367SmrgIf the program has not previously called
4069d17cd367Smrg<function>IceInitThreads</function>
4070d17cd367Smrg<function>IceAppLockConn</function>
4071d17cd367Smrghas no effect.</para>
4072d17cd367Smrg
4073d17cd367Smrg<funcsynopsis>
4074d17cd367Smrg<funcprototype>
4075d17cd367Smrg  <funcdef>void<function> IceAppUnlockConn</function></funcdef>
4076d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
4077d17cd367Smrg</funcprototype>
4078d17cd367Smrg</funcsynopsis>
4079d17cd367Smrg
4080d17cd367Smrg<variablelist remap='IP'>
4081d17cd367Smrg  <varlistentry>
4082d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
4083d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
4084d17cd367Smrg  </varlistentry>
4085d17cd367Smrg</variablelist>
4086d17cd367Smrg
4087d17cd367Smrg<para>The
4088d17cd367Smrg<function>IceAppUnlockConn</function>
4089d17cd367Smrgfunction allows other threads to complete ICElib
4090d17cd367Smrgcalls on the connection that were blocked by a previous call to
4091d17cd367Smrg<function>IceAppLockConn</function>
4092d17cd367Smrgfrom this thread.  If the program has not previously called
4093d17cd367Smrg<function>IceInitThreads</function>
4094d17cd367Smrg<function>IceAppUnlockConn</function>
4095d17cd367Smrghas no effect.</para>
4096d17cd367Smrg</chapter>
4097d17cd367Smrg
4098d17cd367Smrg<chapter id='miscellaneous_functions'>
4099d17cd367Smrg<title>Miscellaneous Functions</title>
4100d17cd367Smrg
4101d17cd367Smrg
4102d17cd367Smrg
4103d17cd367Smrg
4104d17cd367Smrg<para>To allocate scratch space (for example, when generating
4105d17cd367Smrgmessages with variable data), use
4106d17cd367Smrg<function>IceAllocScratch</function>
4107d17cd367SmrgEach ICE connection has one scratch space associated with it.
4108d17cd367SmrgThe scratch space starts off as empty and grows as needed.
4109d17cd367SmrgThe contents of the scratch space is not guaranteed to be preserved
4110d17cd367Smrgafter any ICElib function is called.</para>
4111d17cd367Smrg
4112d17cd367Smrg
4113d17cd367Smrg<funcsynopsis>
4114d17cd367Smrg<funcprototype>
4115d17cd367Smrg  <funcdef>char<function> *IceAllocScratch</function></funcdef>
4116d17cd367Smrg    <paramdef>IceConn<parameter> ice_conn</parameter></paramdef>
4117d17cd367Smrg    <paramdef>unsigned long<parameter> size</parameter></paramdef>
4118d17cd367Smrg</funcprototype>
4119d17cd367Smrg</funcsynopsis>
4120d17cd367Smrg
4121d17cd367Smrg<variablelist remap='IP'>
4122d17cd367Smrg  <varlistentry>
4123d17cd367Smrg    <term><emphasis remap='I'>ice_conn</emphasis></term>
4124d17cd367Smrg    <listitem><para>The ICE connection object.</para></listitem>
4125d17cd367Smrg  </varlistentry>
4126d17cd367Smrg  <varlistentry>
4127d17cd367Smrg    <term><emphasis remap='I'>size</emphasis></term>
4128d17cd367Smrg    <listitem><para>The number of bytes required.</para></listitem>
4129d17cd367Smrg  </varlistentry>
4130d17cd367Smrg</variablelist>
4131d17cd367Smrg
4132d17cd367Smrg<para>Note that the memory returned by
4133d17cd367Smrg<function>IceAllocScratch</function>
4134d17cd367Smrgshould not be freed by the caller.
4135d17cd367SmrgThe ICE library will free the memory when the ICE connection is closed.</para>
4136d17cd367Smrg</chapter>
4137d17cd367Smrg
4138d17cd367Smrg<chapter id='acknowledgements'>
4139d17cd367Smrg<title>Acknowledgements</title>
4140d17cd367Smrg
4141d17cd367Smrg
4142d17cd367Smrg<para>
4143d17cd367SmrgThanks to Bob Scheifler for his thoughtful input on the design
4144d17cd367Smrgof the ICE library.  Thanks also to Jordan Brown, Larry Cable, Donna Converse,
4145d17cd367SmrgClive Feather, Stephen Gildea, Vania Joloboff, Kaleb Keithley,
4146d17cd367SmrgStuart Marks, Hiro Miyamoto, Ralph Swick, Jim VanGilder, and Mike Wexler.
4147d17cd367Smrg</para>
4148d17cd367Smrg</chapter>
4149d17cd367Smrg
4150d17cd367Smrg<appendix id="authentication_utility_functions">
4151d17cd367Smrg<title>Authentication Utility Functions</title>
4152d17cd367Smrg
4153d17cd367Smrg
4154d17cd367Smrg<para>
4155d17cd367SmrgAs discussed in this document, the means by which authentication data
4156d17cd367Smrgis obtained by the ICE library (for
4157d17cd367Smrg<function>ConnectionSetup</function>
4158d17cd367Smrgmessages or
4159d17cd367Smrg<function>ProtocolSetup</function>
4160d17cd367Smrgmessages) is implementation-dependent.&dagger;
4161d17cd367Smrg<footnote remap='FS'>
4162d17cd367Smrg<para>The X Consortium's ICElib implementation assumes the presence of an
4163d17cd367SmrgICE authority file.
4164d17cd367Smrg</para></footnote>
4165d17cd367Smrg</para>
4166d17cd367Smrg
4167d17cd367Smrg<para>
4168d17cd367SmrgThis appendix describes some utility functions that manipulate an
4169d17cd367SmrgICE authority file.  The authority file can be used to pass authentication
4170d17cd367Smrgdata between clients.
4171d17cd367Smrg</para>
4172d17cd367Smrg
4173d17cd367Smrg<para>The basic operations on the .ICEauthority file are:</para>
4174d17cd367Smrg
4175d17cd367Smrg<itemizedlist>
4176d17cd367Smrg  <listitem>
4177d17cd367Smrg    <para>Get file name</para>
4178d17cd367Smrg  </listitem>
4179d17cd367Smrg  <listitem>
4180d17cd367Smrg    <para>Lock</para>
4181d17cd367Smrg  </listitem>
4182d17cd367Smrg  <listitem>
4183d17cd367Smrg    <para>Unlock</para>
4184d17cd367Smrg  </listitem>
4185d17cd367Smrg  <listitem>
4186d17cd367Smrg    <para>Read entry</para>
4187d17cd367Smrg  </listitem>
4188d17cd367Smrg  <listitem>
4189d17cd367Smrg    <para>Write entry</para>
4190d17cd367Smrg  </listitem>
4191d17cd367Smrg  <listitem>
4192d17cd367Smrg    <para>Search for entry</para>
4193d17cd367Smrg  </listitem>
4194d17cd367Smrg</itemizedlist>
4195d17cd367Smrg
4196d17cd367Smrg<para>
4197d17cd367SmrgThese are fairly low-level operations, and it is expected that a program,
4198d17cd367Smrglike "iceauth", would exist to add, remove, and display entries in the file.
4199d17cd367Smrg</para>
4200d17cd367Smrg
4201d17cd367Smrg<para>
4202d17cd367SmrgIn order to use these utility functions, the
4203d17cd367Smrg&lt;<symbol role='Pn'>X11/ICE/ICEutil.h</symbol>&gt;
4204d17cd367Smrgheader file must be included.
4205d17cd367Smrg</para>
4206d17cd367Smrg
4207d17cd367Smrg<para>
4208d17cd367SmrgAn entry in the .ICEauthority file is defined by the following data structure:
4209d17cd367Smrg</para>
4210d17cd367Smrg
4211d17cd367Smrg
4212d17cd367Smrg<literallayout class="monospaced">
4213d17cd367Smrgtypedef struct {
4214d17cd367Smrg     char *protocol_name;
4215d17cd367Smrg     unsigned short protocol_data_length;
4216d17cd367Smrg     char *protocol_data;
4217d17cd367Smrg     char *network_id;
4218d17cd367Smrg     char *auth_name;
4219d17cd367Smrg     unsigned short auth_data_length;
4220d17cd367Smrg     char *auth_data;
4221d17cd367Smrg} IceAuthFileEntry;
4222d17cd367Smrg</literallayout>
4223d17cd367Smrg
4224d17cd367Smrg
4225d17cd367Smrg<para>
4226d17cd367SmrgThe protocol_name member is either "ICE" for connection setup authentication
4227d17cd367Smrgor the subprotocol name, such as "XSMP".  For each entry, protocol specific
4228d17cd367Smrgdata can be specified in the protocol_data member.  This can be used
4229d17cd367Smrgto search for old entries that need to be removed from the file.
4230d17cd367Smrg</para>
4231d17cd367Smrg
4232d17cd367Smrg<para>
4233d17cd367SmrgThe network_id member is the network ID of the client accepting
4234d17cd367Smrgauthentication (for example, the network ID of a session manager).
4235d17cd367SmrgA network ID has the following form:
4236d17cd367Smrg</para>
4237d17cd367Smrg
4238d17cd367Smrg<informaltable pgwide='0' frame='none'>
4239d17cd367Smrg  <tgroup cols='3' align='center'>
4240d17cd367Smrg    <colspec colname='c1'/>
4241d17cd367Smrg    <colspec colname='c2'/>
4242d17cd367Smrg    <colspec colname='c3'/>
4243d17cd367Smrg    <tbody>
4244d17cd367Smrg      <row>
4245d17cd367Smrg        <entry align='left'></entry>
4246d17cd367Smrg        <entry align='left'>tcp/&lt;hostname&gt;:&lt;portnumber&gt;</entry>
4247d17cd367Smrg        <entry align='left'>or</entry>
4248d17cd367Smrg      </row>
4249d17cd367Smrg      <row>
4250d17cd367Smrg        <entry align='left'></entry>
4251d17cd367Smrg        <entry align='left'>decnet/&lt;hostname&gt;::&lt;objname&gt;</entry>
4252d17cd367Smrg        <entry align='left'>or</entry>
4253d17cd367Smrg      </row>
4254d17cd367Smrg      <row>
4255d17cd367Smrg        <entry align='left'></entry>
4256d17cd367Smrg        <entry align='left'>local/&lt;hostname&gt;:&lt;path&gt;</entry>
4257d17cd367Smrg        <entry align='left'></entry>
4258d17cd367Smrg      </row>
4259d17cd367Smrg    </tbody>
4260d17cd367Smrg  </tgroup>
4261d17cd367Smrg</informaltable>
4262d17cd367Smrg
4263d17cd367Smrg<para>
4264d17cd367SmrgThe auth_name member is the name of the authentication method.
4265d17cd367SmrgThe auth_data member is the actual authentication data,
4266d17cd367Smrgand the auth_data_length member is the number of bytes in the data.
4267d17cd367Smrg</para>
4268d17cd367Smrg
4269d17cd367Smrg<para>
4270d17cd367SmrgTo obtain the default authorization file name, use
4271d17cd367Smrg<function>IceAuthFileName</function>
4272d17cd367Smrg</para>
4273d17cd367Smrg
4274d17cd367Smrg<literallayout remap='FD'>
4275d17cd367Smrgchar *IceAuthFileName()
4276d17cd367Smrg</literallayout>
4277d17cd367Smrg
4278d17cd367Smrg<para>
4279d17cd367SmrgIf the ICEAUTHORITY environment variable if set, this value is returned.
4280d17cd367SmrgOtherwise, the default authorization file name is $HOME/.ICEauthority.
4281d17cd367SmrgThis name is statically allocated and should not be freed.
4282d17cd367Smrg</para>
4283d17cd367Smrg
4284d17cd367Smrg<para>
4285d17cd367SmrgTo synchronously update the authorization file, the file must
4286d17cd367Smrgbe locked with a call to
4287d17cd367Smrg<function>IceLockAuthFile</function>
4288d17cd367SmrgThis function takes advantage of the fact that the
4289d17cd367Smrg<function>link</function>
4290d17cd367Smrgsystem call will fail if the name of the new link already exists.
4291d17cd367Smrg</para>
4292d17cd367Smrg
4293d17cd367Smrg<funcsynopsis>
4294d17cd367Smrg<funcprototype>
4295d17cd367Smrg  <funcdef>int<function> IceLockAuthFile</function></funcdef>
4296d17cd367Smrg    <paramdef>char<parameter> *file_name</parameter></paramdef>
4297d17cd367Smrg    <paramdef>int<parameter> retries</parameter></paramdef>
4298d17cd367Smrg    <paramdef>int<parameter> timeout</parameter></paramdef>
4299d17cd367Smrg    <paramdef>long<parameter> dead</parameter></paramdef>
4300d17cd367Smrg</funcprototype>
4301d17cd367Smrg</funcsynopsis>
4302d17cd367Smrg
4303d17cd367Smrg<variablelist remap='IP'>
4304d17cd367Smrg  <varlistentry>
4305d17cd367Smrg    <term><emphasis remap='I'>file_name</emphasis></term>
4306d17cd367Smrg    <listitem><para>The authorization file to lock.</para></listitem>
4307d17cd367Smrg  </varlistentry>
4308d17cd367Smrg  <varlistentry>
4309d17cd367Smrg    <term><emphasis remap='I'>retries</emphasis></term>
4310d17cd367Smrg    <listitem>
4311d17cd367Smrg      <para>The number of retries.</para>
4312d17cd367Smrg    </listitem>
4313d17cd367Smrg  </varlistentry>
4314d17cd367Smrg  <varlistentry>
4315d17cd367Smrg    <term><emphasis remap='I'>timeout</emphasis></term>
4316d17cd367Smrg    <listitem>
4317d17cd367Smrg      <para>The number of seconds before each retry.</para>
4318d17cd367Smrg    </listitem>
4319d17cd367Smrg  </varlistentry>
4320d17cd367Smrg  <varlistentry>
4321d17cd367Smrg    <term><emphasis remap='I'>dead</emphasis></term>
4322d17cd367Smrg    <listitem>
4323d17cd367Smrg      <para>
4324d17cd367SmrgIf a lock already exists that is the specified dead seconds old,
4325d17cd367Smrgit is broken.
4326d17cd367SmrgA value of zero is used to unconditionally break an old lock.
4327d17cd367Smrg      </para>
4328d17cd367Smrg    </listitem>
4329d17cd367Smrg  </varlistentry>
4330d17cd367Smrg</variablelist>
4331d17cd367Smrg
4332d17cd367Smrg<para>One of three values is returned:</para>
4333d17cd367Smrg
4334d17cd367Smrg<itemizedlist>
4335d17cd367Smrg  <listitem>
4336d17cd367Smrg    <para>
4337d17cd367Smrg<function>IceAuthLockSuccess</function> - the lock succeeded.
4338d17cd367Smrg    </para>
4339d17cd367Smrg  </listitem>
4340d17cd367Smrg  <listitem>
4341d17cd367Smrg    <para>
4342d17cd367Smrg<function>IceAuthLockError</function> - a system error occurred, and
4343d17cd367Smrg<function>errno</function> may prove useful.
4344d17cd367Smrg    </para>
4345d17cd367Smrg  </listitem>
4346d17cd367Smrg  <listitem>
4347d17cd367Smrg    <para>
4348d17cd367Smrg<function>IceAuthLockTimeout</function> - the specified number of
4349d17cd367Smrgretries failed.
4350d17cd367Smrg    </para>
4351d17cd367Smrg  </listitem>
4352d17cd367Smrg</itemizedlist>
4353d17cd367Smrg
4354d17cd367Smrg<para>
4355d17cd367SmrgTo unlock an authorization file, use <function>IceUnlockAuthFile</function>
4356d17cd367Smrg</para>
4357d17cd367Smrg
4358d17cd367Smrg<funcsynopsis>
4359d17cd367Smrg<funcprototype>
4360d17cd367Smrg  <funcdef>int<function> IceUnlockAuthFile</function></funcdef>
4361d17cd367Smrg    <paramdef>char<parameter> *file_name</parameter></paramdef>
4362d17cd367Smrg</funcprototype>
4363d17cd367Smrg</funcsynopsis>
4364d17cd367Smrg
4365d17cd367Smrg<variablelist remap='IP'>
4366d17cd367Smrg  <varlistentry>
4367d17cd367Smrg    <term><emphasis remap='I'>file_name</emphasis></term>
4368d17cd367Smrg    <listitem><para>The authorization file to unlock.</para></listitem>
4369d17cd367Smrg  </varlistentry>
4370d17cd367Smrg</variablelist>
4371d17cd367Smrg
4372d17cd367Smrg<para>
4373d17cd367SmrgTo read the next entry in an authorization file, use
4374d17cd367Smrg<function>IceReadAuthFileEntry</function>
4375d17cd367Smrg</para>
4376d17cd367Smrg
4377d17cd367Smrg<funcsynopsis>
4378d17cd367Smrg<funcprototype>
4379d17cd367Smrg  <funcdef>IceAuthFileEntry<function> *IceReadAuthFileEntry</function></funcdef>
4380d17cd367Smrg    <paramdef>FILE<parameter> *auth_file</parameter></paramdef>
4381d17cd367Smrg</funcprototype>
4382d17cd367Smrg</funcsynopsis>
4383d17cd367Smrg
4384d17cd367Smrg<variablelist remap='IP'>
4385d17cd367Smrg  <varlistentry>
4386d17cd367Smrg    <term><emphasis remap='I'>auth_file</emphasis></term>
4387d17cd367Smrg    <listitem><para>The authorization file.</para></listitem>
4388d17cd367Smrg  </varlistentry>
4389d17cd367Smrg</variablelist>
4390d17cd367Smrg
4391d17cd367Smrg<para>
4392d17cd367SmrgNote that it is the responsibility of the application to open the file
4393d17cd367Smrgfor reading before calling this function.  If an error is encountered,
4394d17cd367Smrgor there are no more entries to read, NULL is returned.
4395d17cd367Smrg</para>
4396d17cd367Smrg
4397d17cd367Smrg<para>
4398d17cd367SmrgEntries should be free with a call to
4399d17cd367Smrg<function>IceFreeAuthFileEntry</function>
4400d17cd367Smrg</para>
4401d17cd367Smrg
4402d17cd367Smrg<para>
4403d17cd367SmrgTo write an entry in an authorization file, use
4404d17cd367Smrg<function>IceWriteAuthFileEntry</function>
4405d17cd367Smrg</para>
4406d17cd367Smrg
4407d17cd367Smrg<funcsynopsis>
4408d17cd367Smrg<funcprototype>
4409d17cd367Smrg  <funcdef>Status<function> IceWriteAuthFileEntry</function></funcdef>
4410d17cd367Smrg    <paramdef>FILE<parameter> *auth_file</parameter></paramdef>
4411d17cd367Smrg    <paramdef>IceAuthFileEntry<parameter> *entry</parameter></paramdef>
4412d17cd367Smrg</funcprototype>
4413d17cd367Smrg</funcsynopsis>
4414d17cd367Smrg
4415d17cd367Smrg<variablelist remap='IP'>
4416d17cd367Smrg  <varlistentry>
4417d17cd367Smrg    <term><emphasis remap='I'>auth_file</emphasis></term>
4418d17cd367Smrg    <listitem><para>The authorization file.</para></listitem>
4419d17cd367Smrg  </varlistentry>
4420d17cd367Smrg  <varlistentry>
4421d17cd367Smrg    <term><emphasis remap='I'>entry</emphasis></term>
4422d17cd367Smrg    <listitem><para>The entry to write.</para></listitem>
4423d17cd367Smrg  </varlistentry>
4424d17cd367Smrg</variablelist>
4425d17cd367Smrg
4426d17cd367Smrg<para>
4427d17cd367SmrgNote that it is the responsibility of the application to open the file
4428d17cd367Smrgfor writing before calling this function.  The function returns a nonzero
4429d17cd367Smrgstatus if the operation was successful.
4430d17cd367Smrg</para>
4431d17cd367Smrg
4432d17cd367Smrg
4433d17cd367Smrg<para>
4434d17cd367SmrgTo search the default authorization file for an entry that matches a given
4435d17cd367Smrgprotocol_name/network_id/auth_name tuple, use
4436d17cd367Smrg<function>IceGetAuthFileEntry</function>
4437d17cd367Smrg</para>
4438d17cd367Smrg
4439d17cd367Smrg<funcsynopsis>
4440d17cd367Smrg<funcprototype>
4441d17cd367Smrg  <funcdef>IceAuthFileEntry<function> *IceGetAuthFileEntry</function></funcdef>
4442d17cd367Smrg    <paramdef>char<parameter> *protocol_name</parameter></paramdef>
4443d17cd367Smrg    <paramdef>char<parameter> *network_id</parameter></paramdef>
4444d17cd367Smrg    <paramdef>char<parameter> *auth_name</parameter></paramdef>
4445d17cd367Smrg</funcprototype>
4446d17cd367Smrg</funcsynopsis>
4447d17cd367Smrg
4448d17cd367Smrg<variablelist remap='IP'>
4449d17cd367Smrg  <varlistentry>
4450d17cd367Smrg    <term><emphasis remap='I'>auth_file</emphasis></term>
4451d17cd367Smrg    <listitem><para>The name of the protocol to search on.</para></listitem>
4452d17cd367Smrg  </varlistentry>
4453d17cd367Smrg  <varlistentry>
4454d17cd367Smrg    <term><emphasis remap='I'>network_id</emphasis></term>
4455d17cd367Smrg    <listitem>
4456d17cd367Smrg      <para>The network ID to search on.</para>
4457d17cd367Smrg    </listitem>
4458d17cd367Smrg  </varlistentry>
4459d17cd367Smrg  <varlistentry>
4460d17cd367Smrg    <term><emphasis remap='I'>auth_name</emphasis></term>
4461d17cd367Smrg    <listitem>
4462d17cd367Smrg      <para>The authentication method to search on.</para>
4463d17cd367Smrg    </listitem>
4464d17cd367Smrg  </varlistentry>
4465d17cd367Smrg</variablelist>
4466d17cd367Smrg
4467d17cd367Smrg<para>
4468d17cd367SmrgIf <function>IceGetAuthFileEntry</function>
4469d17cd367Smrgfails to find such an entry, NULL is returned.
4470d17cd367Smrg</para>
4471d17cd367Smrg
4472d17cd367Smrg
4473d17cd367Smrg<para>
4474d17cd367SmrgTo free an entry returned by
4475d17cd367Smrg<function>IceReadAuthFileEntry</function> or
4476d17cd367Smrg<function>IceGetAuthFileEntry</function> use
4477d17cd367Smrg<function>IceFreeAuthFileEntry</function>
4478d17cd367Smrg</para>
4479d17cd367Smrg
4480d17cd367Smrg<funcsynopsis>
4481d17cd367Smrg<funcprototype>
4482d17cd367Smrg  <funcdef>void<function> IceFreeAuthFileEntry</function></funcdef>
4483d17cd367Smrg    <paramdef>IceAuthFileEntry<parameter> *entry</parameter></paramdef>
4484d17cd367Smrg</funcprototype>
4485d17cd367Smrg</funcsynopsis>
4486d17cd367Smrg
4487d17cd367Smrg<variablelist remap='IP'>
4488d17cd367Smrg  <varlistentry>
4489d17cd367Smrg    <term><emphasis remap='I'>entry</emphasis></term>
4490d17cd367Smrg    <listitem><para>The entry to free.</para></listitem>
4491d17cd367Smrg  </varlistentry>
4492d17cd367Smrg</variablelist>
4493d17cd367Smrg
4494d17cd367Smrg</appendix>
4495d17cd367Smrg
4496d17cd367Smrg<appendix id="mit_magic_cookie_1_authentication">
4497d17cd367Smrg<title>MIT-MAGIC-COOKIE-1 Authentication</title>
4498d17cd367Smrg
4499d17cd367Smrg
4500d17cd367Smrg<para>The X Consortium's ICElib implementation supports a simple
4501d17cd367SmrgMIT-MAGIC-COOKIE-1 authentication scheme using the authority file utilities
4502d17cd367Smrgdescribed in Appendix A.</para>
4503d17cd367Smrg
4504d17cd367Smrg<para>In this model, an application, such as a session manager, obtains a
4505d17cd367Smrgmagic cookie by calling
4506d17cd367Smrg<function>IceGenerateMagicCookie</function>
4507d17cd367Smrgand then stores it in the user's local .ICEauthority file
4508d17cd367Smrgso that local clients can connect.  In order to allow remote clients to
4509d17cd367Smrgconnect, some remote execution mechanism should be used to store the
4510d17cd367Smrgmagic cookie in the user's .ICEauthority file on a remote machine.</para>
4511d17cd367Smrg
4512d17cd367Smrg<para>In addition to storing the magic cookie in the .ICEauthority file, the
4513d17cd367Smrgapplication needs to call the
4514d17cd367Smrg<function>IceSetPaAuthData</function>
4515d17cd367Smrgfunction in order to store the magic cookie in memory.  When it comes time
4516d17cd367Smrgfor the MIT-MAGIC-COOKIE-1 authentication procedure to accept or reject the
4517d17cd367Smrgconnection, it will compare the magic cookie presented by the requestor to
4518d17cd367Smrgthe magic cookie in memory.</para>
4519d17cd367Smrg
4520d17cd367Smrg<funcsynopsis>
4521d17cd367Smrg<funcprototype>
4522d17cd367Smrg  <funcdef>char<function> *IceGenerateMagicCookie</function></funcdef>
4523d17cd367Smrg    <paramdef>int<parameter> length</parameter></paramdef>
4524d17cd367Smrg</funcprototype>
4525d17cd367Smrg</funcsynopsis>
4526d17cd367Smrg
4527d17cd367Smrg<variablelist remap='IP'>
4528d17cd367Smrg  <varlistentry>
4529d17cd367Smrg    <term><emphasis remap='I'>length</emphasis></term>
4530d17cd367Smrg    <listitem><para>The desired length of the magic cookie.</para></listitem>
4531d17cd367Smrg  </varlistentry>
4532d17cd367Smrg</variablelist>
4533d17cd367Smrg
4534d17cd367Smrg
4535d17cd367Smrg<para>The magic cookie returned will be null-terminated.  If memory can not be
4536d17cd367Smrgallocated for the magic cookie, the function will return NULL.
4537d17cd367SmrgOtherwise, the magic cookie should be freed with a call to
4538d17cd367Smrg<function>free</function></para>
4539d17cd367Smrg
4540d17cd367Smrg
4541d17cd367Smrg<para>To store the authentication data in memory, use
4542d17cd367Smrg<function>IceSetPaAuthData</function>
4543d17cd367SmrgCurrently, this function is only used for MIT-MAGIC-COOKIE-1
4544d17cd367Smrgauthentication, but it may be used for additional authentication
4545d17cd367Smrgmethods in the future.</para>
4546d17cd367Smrg
4547d17cd367Smrg<funcsynopsis>
4548d17cd367Smrg<funcprototype>
4549d17cd367Smrg  <funcdef>void<function> IceSetPaAuthData</function></funcdef>
4550d17cd367Smrg    <paramdef>int<parameter> num_entries</parameter></paramdef>
4551d17cd367Smrg    <paramdef>IceAuthDataEntry<parameter> *entries</parameter></paramdef>
4552d17cd367Smrg</funcprototype>
4553d17cd367Smrg</funcsynopsis>
4554d17cd367Smrg
4555d17cd367Smrg<variablelist remap='IP'>
4556d17cd367Smrg  <varlistentry>
4557d17cd367Smrg    <term><emphasis remap='I'>num_entries</emphasis></term>
4558d17cd367Smrg    <listitem><para>The number of authentication data entries.</para></listitem>
4559d17cd367Smrg  </varlistentry>
4560d17cd367Smrg  <varlistentry>
4561d17cd367Smrg    <term><emphasis remap='I'>entries</emphasis></term>
4562d17cd367Smrg    <listitem><para>The list of authentication data entries.</para></listitem>
4563d17cd367Smrg  </varlistentry>
4564d17cd367Smrg</variablelist>
4565d17cd367Smrg
4566d17cd367Smrg<para>Each entry has associated with it a protocol name
4567d17cd367Smrg(for example, "ICE" for ICE connection setup authentication,
4568d17cd367Smrg"XSMP" for session management authentication), a network ID for the
4569d17cd367Smrg"accepting" client, an authentication name (for example, MIT-MAGIC-COOKIE-1),
4570d17cd367Smrgand authentication data.  The ICE library
4571d17cd367Smrgwill merge these entries with previously set entries, based on the
4572d17cd367Smrg(protocol_name, network_id, auth_name) tuple.</para>
4573d17cd367Smrg
4574d17cd367Smrg
4575d17cd367Smrg
4576d17cd367Smrg<literallayout class="monospaced">
4577d17cd367Smrgtypedef struct {
4578d17cd367Smrg	char *protocol_name;
4579d17cd367Smrg	char *network_id;
4580d17cd367Smrg	char *auth_name;
4581d17cd367Smrg	unsigned short auth_data_length;
4582d17cd367Smrg	char *auth_data;
4583d17cd367Smrg} IceAuthDataEntry;
4584d17cd367Smrg</literallayout>
4585d17cd367Smrg
4586d17cd367Smrg</appendix>
4587d17cd367Smrg</book>
4588d17cd367Smrg
4589