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<<symbol role='Pn'>X11/ICE/ICElib.h</symbol>> 129d17cd367Smrgdefines all of the ICElib data structures and function prototypes. 130d17cd367Smrg<function>ICElib.h</function> 131d17cd367Smrgincludes the header file 132d17cd367Smrg<<symbol role='Pn'>X11/ICE/ICE.h</symbol>>, 133d17cd367Smrgwhich defines all of the ICElib constants. 134d17cd367SmrgProtocol libraries that need to read and write messages should include 135d17cd367Smrgthe header file 136d17cd367Smrg<<symbol role='Pn'>X11/ICE/ICEmsg.h</symbol>>.</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/<hostname>:<portnumber></entry> 12899ef0b394Smrg <entry>or</entry> 1290d17cd367Smrg </row> 1291d17cd367Smrg <row> 12929ef0b394Smrg <entry>decnet/<hostname>::<objname></entry> 12939ef0b394Smrg <entry>or</entry> 1294d17cd367Smrg </row> 1295d17cd367Smrg <row> 12969ef0b394Smrg <entry>local/<hostname>:<path></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/<hostname>:<portnumber></entry> 15759ef0b394Smrg <entry>or</entry> 1576d17cd367Smrg </row> 1577d17cd367Smrg <row> 15789ef0b394Smrg <entry>decnet/<hostname>::<objname></entry> 15799ef0b394Smrg <entry>or</entry> 1580d17cd367Smrg </row> 1581d17cd367Smrg <row> 15829ef0b394Smrg <entry>local/<hostname>:<path></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, &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 > 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><C_data_type><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'><C_data_type></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><C_data_type><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'><C_data_type></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><C_data_type><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'><C_data_type></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><C_data_type><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'><C_data_type></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><C_data_type><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'><C_data_type></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.† 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<<symbol role='Pn'>X11/ICE/ICEutil.h</symbol>> 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/<hostname>:<portnumber></entry> 42429ef0b394Smrg <entry>or</entry> 4243d17cd367Smrg </row> 4244d17cd367Smrg <row> 42459ef0b394Smrg <entry>decnet/<hostname>::<objname></entry> 42469ef0b394Smrg <entry>or</entry> 4247d17cd367Smrg </row> 4248d17cd367Smrg <row> 42499ef0b394Smrg <entry>local/<hostname>:<path></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