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