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