ICElibint.h revision 3bf3b463
1266e564dSmrg/****************************************************************************** 2266e564dSmrg 3266e564dSmrg 4266e564dSmrgCopyright 1993, 1998 The Open Group 5266e564dSmrg 6266e564dSmrgPermission to use, copy, modify, distribute, and sell this software and its 7266e564dSmrgdocumentation for any purpose is hereby granted without fee, provided that 8266e564dSmrgthe above copyright notice appear in all copies and that both that 9266e564dSmrgcopyright notice and this permission notice appear in supporting 10266e564dSmrgdocumentation. 11266e564dSmrg 12266e564dSmrgThe above copyright notice and this permission notice shall be included in 13266e564dSmrgall copies or substantial portions of the Software. 14266e564dSmrg 15266e564dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16266e564dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17266e564dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18266e564dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19266e564dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20266e564dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21266e564dSmrg 22266e564dSmrgExcept as contained in this notice, the name of The Open Group shall not be 23266e564dSmrgused in advertising or otherwise to promote the sale, use or other dealings 24266e564dSmrgin this Software without prior written authorization from The Open Group. 25266e564dSmrg 26266e564dSmrgAuthor: Ralph Mor, X Consortium 27266e564dSmrg******************************************************************************/ 28266e564dSmrg 29266e564dSmrg#ifndef _ICELIBINT_H_ 30266e564dSmrg#define _ICELIBINT_H_ 31266e564dSmrg 32266e564dSmrg#include <X11/Xos.h> 33266e564dSmrg#include <X11/Xfuncs.h> 34266e564dSmrg#include <X11/Xmd.h> 35266e564dSmrg#include <X11/ICE/ICEproto.h> 36266e564dSmrg#include <X11/ICE/ICEconn.h> 37266e564dSmrg#include <X11/ICE/ICEmsg.h> 38698f425bSmrg#include <X11/ICE/ICEutil.h> 39c5629e66Smrg#ifdef WIN32 40c5629e66Smrg#include <X11/Xwindows.h> 41c5629e66Smrg#endif 42266e564dSmrg 43266e564dSmrg#include <stdlib.h> 44266e564dSmrg#include <stddef.h> 45266e564dSmrg 463bf3b463Smrg#ifdef O_CLOEXEC 473bf3b463Smrg#define FOPEN_CLOEXEC "e" 483bf3b463Smrg#else 493bf3b463Smrg#define FOPEN_CLOEXEC "" 503bf3b463Smrg#define O_CLOEXEC 0 513bf3b463Smrg#endif 52266e564dSmrg 53266e564dSmrg/* 54266e564dSmrg * Vendor & Release 55266e564dSmrg */ 56266e564dSmrg 57266e564dSmrg#define IceVendorString "MIT" 58266e564dSmrg#define IceReleaseString "1.0" 59266e564dSmrg 60266e564dSmrg 61266e564dSmrg/* 62266e564dSmrg * Pad to a 64 bit boundary 63266e564dSmrg */ 64266e564dSmrg 65266e564dSmrg#define PAD64(_bytes) ((8 - ((unsigned int) (_bytes) % 8)) % 8) 66266e564dSmrg 67fb5e8d76Smrg#define PADDED_BYTES64(_bytes) ((unsigned int) _bytes + PAD64 (_bytes)) 68266e564dSmrg 69266e564dSmrg 70266e564dSmrg/* 71266e564dSmrg * Pad to 32 bit boundary 72266e564dSmrg */ 73266e564dSmrg 74266e564dSmrg#define PAD32(_bytes) ((4 - ((unsigned int) (_bytes) % 4)) % 4) 75266e564dSmrg 76fb5e8d76Smrg#define PADDED_BYTES32(_bytes) ((unsigned int) _bytes + PAD32 (_bytes)) 77266e564dSmrg 78266e564dSmrg 79266e564dSmrg/* 80266e564dSmrg * Number of 8 byte units in _bytes. 81266e564dSmrg */ 82266e564dSmrg 83266e564dSmrg#define WORD64COUNT(_bytes) (((unsigned int) ((_bytes) + 7)) >> 3) 84266e564dSmrg 85266e564dSmrg 86266e564dSmrg/* 87266e564dSmrg * Number of 4 byte units in _bytes. 88266e564dSmrg */ 89266e564dSmrg 90266e564dSmrg#define WORD32COUNT(_bytes) (((unsigned int) ((_bytes) + 3)) >> 2) 91266e564dSmrg 92266e564dSmrg 93266e564dSmrg/* 94266e564dSmrg * Given a string, compute the number of bytes for the STRING representation 95266e564dSmrg */ 96266e564dSmrg 97266e564dSmrg#define STRING_BYTES(_string) \ 98266e564dSmrg (2 + strlen (_string) + PAD32 (2 + strlen (_string))) 99266e564dSmrg 100266e564dSmrg 101266e564dSmrg/* 102266e564dSmrg * Size of ICE input/output buffers 103266e564dSmrg */ 104266e564dSmrg 105266e564dSmrg#define ICE_INBUFSIZE 1024 106266e564dSmrg 107266e564dSmrg#define ICE_OUTBUFSIZE 1024 108266e564dSmrg 109266e564dSmrg 110266e564dSmrg/* 1111009a292Smrg * Maximum number of ICE authentication methods allowed, and maximum 112266e564dSmrg * number of authentication data entries allowed to be set in the 113266e564dSmrg * IceSetPaAuthData function. 114266e564dSmrg * 115266e564dSmrg * We should use linked lists, but this is easier and should suffice. 116266e564dSmrg */ 117266e564dSmrg 118266e564dSmrg#define MAX_ICE_AUTH_NAMES 32 119266e564dSmrg#define ICE_MAX_AUTH_DATA_ENTRIES 100 120266e564dSmrg 121266e564dSmrg 122266e564dSmrg/* 123266e564dSmrg * ICE listen object 124266e564dSmrg */ 125266e564dSmrg 126266e564dSmrgstruct _IceListenObj { 127266e564dSmrg struct _XtransConnInfo *trans_conn; /* transport connection object */ 128266e564dSmrg char *network_id; 129266e564dSmrg IceHostBasedAuthProc host_based_auth_proc; 130266e564dSmrg}; 131266e564dSmrg 132266e564dSmrg 133266e564dSmrg/* 134266e564dSmrg * Some internal data structures for processing ICE messages. 135266e564dSmrg */ 136266e564dSmrg 137266e564dSmrgtypedef void (*_IceProcessCoreMsgProc) ( 138266e564dSmrg IceConn /* iceConn */, 139266e564dSmrg int /* opcode */, 140266e564dSmrg unsigned long /* length */, 141266e564dSmrg Bool /* swap */, 142266e564dSmrg IceReplyWaitInfo * /* replyWait */, 143266e564dSmrg Bool * /* replyReadyRet */, 144266e564dSmrg Bool * /* connectionClosedRet */ 145266e564dSmrg); 146266e564dSmrg 147266e564dSmrgtypedef struct { 148266e564dSmrg int major_version; 149266e564dSmrg int minor_version; 150266e564dSmrg _IceProcessCoreMsgProc process_core_msg_proc; 151266e564dSmrg} _IceVersion; 152266e564dSmrg 153266e564dSmrg 154266e564dSmrg/* 155266e564dSmrg * STORE FOO 156266e564dSmrg */ 157266e564dSmrg 158266e564dSmrg#define STORE_CARD8(_pBuf, _val) \ 1593bf3b463Smrgdo { \ 160266e564dSmrg *((CARD8 *) _pBuf) = _val; \ 161266e564dSmrg _pBuf += 1; \ 1623bf3b463Smrg} while (0) 163266e564dSmrg 164266e564dSmrg#define STORE_CARD16(_pBuf, _val) \ 1653bf3b463Smrgdo { \ 166266e564dSmrg *((CARD16 *) _pBuf) = _val; \ 167266e564dSmrg _pBuf += 2; \ 1683bf3b463Smrg} while (0) 169266e564dSmrg 170266e564dSmrg#define STORE_CARD32(_pBuf, _val) \ 1713bf3b463Smrgdo { \ 172266e564dSmrg *((CARD32 *) _pBuf) = _val; \ 173266e564dSmrg _pBuf += 4; \ 1743bf3b463Smrg} while (0) 175266e564dSmrg 176266e564dSmrg 177266e564dSmrg#define STORE_STRING(_pBuf, _string) \ 1783bf3b463Smrgdo { \ 179fb5e8d76Smrg CARD16 _len = (CARD16) strlen (_string); \ 180266e564dSmrg STORE_CARD16 (_pBuf, _len); \ 181266e564dSmrg memcpy (_pBuf, _string, _len); \ 182266e564dSmrg _pBuf += _len; \ 183266e564dSmrg if (PAD32 (2 + _len)) \ 184266e564dSmrg _pBuf += PAD32 (2 + _len); \ 1853bf3b463Smrg} while (0) 186266e564dSmrg 187266e564dSmrg 1881009a292Smrg/* 1891009a292Smrg * SEND FOO - write to connection instead of buffer 1901009a292Smrg */ 1911009a292Smrg#define SEND_STRING(_iceConn, _string) \ 1923bf3b463Smrgdo { \ 1931009a292Smrg char _padding[3] = { 0 }; \ 1941009a292Smrg CARD16 _len = (CARD16) strlen (_string); \ 1951009a292Smrg IceWriteData32 (_iceConn, 2, &_len); \ 1961009a292Smrg if (_len) \ 1971009a292Smrg IceSendData (_iceConn, _len, (char *) _string); \ 1981009a292Smrg if (PAD32 (2 + _len)) \ 1991009a292Smrg IceSendData (_iceConn, PAD32 (2 + _len), _padding); \ 2003bf3b463Smrg} while (0) 2011009a292Smrg 202266e564dSmrg/* 203266e564dSmrg * EXTRACT FOO 204266e564dSmrg */ 205266e564dSmrg 206266e564dSmrg#define EXTRACT_CARD8(_pBuf, _val) \ 2073bf3b463Smrgdo { \ 208266e564dSmrg _val = *((CARD8 *) _pBuf); \ 209266e564dSmrg _pBuf += 1; \ 2103bf3b463Smrg} while (0) 211266e564dSmrg 212266e564dSmrg#define EXTRACT_CARD16(_pBuf, _swap, _val) \ 2133bf3b463Smrgdo { \ 214266e564dSmrg _val = *((CARD16 *) _pBuf); \ 215266e564dSmrg _pBuf += 2; \ 216266e564dSmrg if (_swap) \ 217266e564dSmrg _val = lswaps (_val); \ 2183bf3b463Smrg} while (0) 219266e564dSmrg 220266e564dSmrg#define EXTRACT_CARD32(_pBuf, _swap, _val) \ 2213bf3b463Smrgdo { \ 222266e564dSmrg _val = *((CARD32 *) _pBuf); \ 223266e564dSmrg _pBuf += 4; \ 224266e564dSmrg if (_swap) \ 225266e564dSmrg _val = lswapl (_val); \ 2263bf3b463Smrg} while (0) 227266e564dSmrg 228266e564dSmrg 229266e564dSmrg#define EXTRACT_STRING(_pBuf, _swap, _string) \ 2303bf3b463Smrgdo { \ 231266e564dSmrg CARD16 _len; \ 232266e564dSmrg EXTRACT_CARD16 (_pBuf, _swap, _len); \ 233fb5e8d76Smrg _string = malloc (_len + 1); \ 2343bf3b463Smrg if (_string != NULL) { \ 2353bf3b463Smrg memcpy (_string, _pBuf, _len); \ 2363bf3b463Smrg _string[_len] = '\0'; \ 2373bf3b463Smrg } \ 238266e564dSmrg _pBuf += _len; \ 239266e564dSmrg if (PAD32 (2 + _len)) \ 240266e564dSmrg _pBuf += PAD32 (2 + _len); \ 2413bf3b463Smrg} while (0) 242266e564dSmrg 243266e564dSmrg#define EXTRACT_LISTOF_STRING(_pBuf, _swap, _count, _strings) \ 2443bf3b463Smrgdo { \ 245266e564dSmrg int _i; \ 246266e564dSmrg for (_i = 0; _i < _count; _i++) \ 247266e564dSmrg EXTRACT_STRING (_pBuf, _swap, _strings[_i]); \ 2483bf3b463Smrg} while (0) 249266e564dSmrg 250266e564dSmrg 251266e564dSmrg#define SKIP_STRING(_pBuf, _swap, _end, _bail) \ 2523bf3b463Smrgdo { \ 253266e564dSmrg CARD16 _len; \ 254266e564dSmrg EXTRACT_CARD16 (_pBuf, _swap, _len); \ 255266e564dSmrg _pBuf += _len + PAD32(2+_len); \ 256266e564dSmrg if (_pBuf > _end) { \ 257266e564dSmrg _bail; \ 258266e564dSmrg } \ 2593bf3b463Smrg} while (0) 260266e564dSmrg 261266e564dSmrg#define SKIP_LISTOF_STRING(_pBuf, _swap, _count, _end, _bail) \ 2623bf3b463Smrgdo { \ 263266e564dSmrg int _i; \ 264266e564dSmrg for (_i = 0; _i < _count; _i++) \ 265266e564dSmrg SKIP_STRING (_pBuf, _swap, _end, _bail); \ 2663bf3b463Smrg} while (0) 267266e564dSmrg 268266e564dSmrg 269a3129944Smrg 270266e564dSmrg/* 271266e564dSmrg * Byte swapping 272266e564dSmrg */ 273266e564dSmrg 274266e564dSmrg/* byte swap a long literal */ 275266e564dSmrg#define lswapl(_val) ((((_val) & 0xff) << 24) |\ 276266e564dSmrg (((_val) & 0xff00) << 8) |\ 277266e564dSmrg (((_val) & 0xff0000) >> 8) |\ 278266e564dSmrg (((_val) >> 24) & 0xff)) 279266e564dSmrg 280266e564dSmrg/* byte swap a short literal */ 281266e564dSmrg#define lswaps(_val) ((((_val) & 0xff) << 8) | (((_val) >> 8) & 0xff)) 282266e564dSmrg 283266e564dSmrg 284a3129944Smrg 285266e564dSmrg/* 286266e564dSmrg * ICE replies (not processed via callbacks because we block) 287266e564dSmrg */ 288266e564dSmrg 289266e564dSmrg#define ICE_CONNECTION_REPLY 1 290266e564dSmrg#define ICE_CONNECTION_ERROR 2 291266e564dSmrg#define ICE_PROTOCOL_REPLY 3 292266e564dSmrg#define ICE_PROTOCOL_ERROR 4 293266e564dSmrg 294266e564dSmrgtypedef struct { 295266e564dSmrg int type; 296266e564dSmrg int version_index; 297266e564dSmrg char *vendor; 298266e564dSmrg char *release; 299266e564dSmrg} _IceConnectionReply; 300266e564dSmrg 301266e564dSmrgtypedef struct { 302266e564dSmrg int type; 303266e564dSmrg char *error_message; 304266e564dSmrg} _IceConnectionError; 305266e564dSmrg 306266e564dSmrgtypedef struct { 307266e564dSmrg int type; 308266e564dSmrg int major_opcode; 309266e564dSmrg int version_index; 310266e564dSmrg char *vendor; 311266e564dSmrg char *release; 312266e564dSmrg} _IceProtocolReply; 313266e564dSmrg 314266e564dSmrgtypedef struct { 315266e564dSmrg int type; 316266e564dSmrg char *error_message; 317266e564dSmrg} _IceProtocolError; 318266e564dSmrg 319266e564dSmrg 320266e564dSmrgtypedef union { 321266e564dSmrg int type; 322266e564dSmrg _IceConnectionReply connection_reply; 323266e564dSmrg _IceConnectionError connection_error; 324266e564dSmrg _IceProtocolReply protocol_reply; 325266e564dSmrg _IceProtocolError protocol_error; 326266e564dSmrg} _IceReply; 327266e564dSmrg 328266e564dSmrg 329266e564dSmrg/* 330266e564dSmrg * Watch for ICE connection create/destroy. 331266e564dSmrg */ 332266e564dSmrg 333266e564dSmrgtypedef struct _IceWatchedConnection { 334266e564dSmrg IceConn iceConn; 335266e564dSmrg IcePointer watch_data; 336266e564dSmrg struct _IceWatchedConnection *next; 337266e564dSmrg} _IceWatchedConnection; 338266e564dSmrg 339266e564dSmrgtypedef struct _IceWatchProc { 340266e564dSmrg IceWatchProc watch_proc; 341266e564dSmrg IcePointer client_data; 342266e564dSmrg _IceWatchedConnection *watched_connections; 343266e564dSmrg struct _IceWatchProc *next; 344266e564dSmrg} _IceWatchProc; 345266e564dSmrg 346266e564dSmrg 347266e564dSmrg/* 348266e564dSmrg * Locking 349266e564dSmrg */ 350266e564dSmrg 351266e564dSmrg#define IceLockConn(_iceConn) 352266e564dSmrg#define IceUnlockConn(_iceConn) 353266e564dSmrg 354266e564dSmrg 355266e564dSmrg/* 356266e564dSmrg * Extern declarations 357266e564dSmrg */ 358266e564dSmrg 359a3129944Smrgextern IceConn _IceConnectionObjs[]; 360a3129944Smrgextern char *_IceConnectionStrings[]; 361a3129944Smrgextern int _IceConnectionCount; 362266e564dSmrg 363a3129944Smrgextern _IceProtocol _IceProtocols[]; 364a3129944Smrgextern int _IceLastMajorOpcode; 365266e564dSmrg 366a3129944Smrgextern int _IceAuthCount; 367a3129944Smrgextern const char *_IceAuthNames[]; 368a3129944Smrgextern IcePoAuthProc _IcePoAuthProcs[]; 369a3129944Smrgextern IcePaAuthProc _IcePaAuthProcs[]; 370266e564dSmrg 371a3129944Smrgextern const int _IceVersionCount; 372a3129944Smrgextern const _IceVersion _IceVersions[]; 373266e564dSmrg 374a3129944Smrgextern _IceWatchProc *_IceWatchProcs; 375266e564dSmrg 376a3129944Smrgextern IceErrorHandler _IceErrorHandler; 377a3129944Smrgextern IceIOErrorHandler _IceIOErrorHandler; 378266e564dSmrg 379a3129944Smrgextern IceAuthDataEntry _IcePaAuthDataEntries[]; 380a3129944Smrgextern int _IcePaAuthDataEntryCount; 381266e564dSmrg 382266e564dSmrgextern void _IceErrorBadMajor ( 383266e564dSmrg IceConn /* iceConn */, 384266e564dSmrg int /* offendingMajor */, 385266e564dSmrg int /* offendingMinor */, 386266e564dSmrg int /* severity */ 387266e564dSmrg); 388266e564dSmrg 389266e564dSmrgextern void _IceErrorNoAuthentication ( 390266e564dSmrg IceConn /* iceConn */, 391266e564dSmrg int /* offendingMinor */ 392266e564dSmrg); 393266e564dSmrg 394266e564dSmrgextern void _IceErrorNoVersion ( 395266e564dSmrg IceConn /* iceConn */, 396266e564dSmrg int /* offendingMinor */ 397266e564dSmrg); 398266e564dSmrg 399266e564dSmrgextern void _IceErrorSetupFailed ( 400266e564dSmrg IceConn /* iceConn */, 401266e564dSmrg int /* offendingMinor */, 4029ef0b394Smrg const char * /* reason */ 403266e564dSmrg); 404266e564dSmrg 405266e564dSmrgextern void _IceErrorAuthenticationRejected ( 406266e564dSmrg IceConn /* iceConn */, 407266e564dSmrg int /* offendingMinor */, 4089ef0b394Smrg const char * /* reason */ 409266e564dSmrg); 410266e564dSmrg 411266e564dSmrgextern void _IceErrorAuthenticationFailed ( 412266e564dSmrg IceConn /* iceConn */, 413266e564dSmrg int /* offendingMinor */, 4149ef0b394Smrg const char * /* reason */ 415266e564dSmrg); 416266e564dSmrg 417266e564dSmrgextern void _IceErrorProtocolDuplicate ( 418266e564dSmrg IceConn /* iceConn */, 4199ef0b394Smrg const char * /* protocolName */ 420266e564dSmrg); 421266e564dSmrg 422266e564dSmrgextern void _IceErrorMajorOpcodeDuplicate ( 423266e564dSmrg IceConn /* iceConn */, 424266e564dSmrg int /* majorOpcode */ 425266e564dSmrg); 426266e564dSmrg 427266e564dSmrgextern void _IceErrorUnknownProtocol ( 428266e564dSmrg IceConn /* iceConn */, 4299ef0b394Smrg const char * /* protocolName */ 430266e564dSmrg); 431266e564dSmrg 432266e564dSmrgextern void _IceAddOpcodeMapping ( 433266e564dSmrg IceConn /* iceConn */, 434266e564dSmrg int /* hisOpcode */, 435266e564dSmrg int /* myOpcode */ 436266e564dSmrg); 437266e564dSmrg 438266e564dSmrgextern char *_IceGetPeerName ( 439266e564dSmrg IceConn /* iceConn */ 440266e564dSmrg); 441266e564dSmrg 442266e564dSmrgextern void _IceFreeConnection ( 443266e564dSmrg IceConn /* iceConn */ 444266e564dSmrg); 445266e564dSmrg 446266e564dSmrgextern void _IceAddReplyWait ( 447266e564dSmrg IceConn /* iceConn */, 448266e564dSmrg IceReplyWaitInfo * /* replyWait */ 449266e564dSmrg); 450266e564dSmrg 451266e564dSmrgextern IceReplyWaitInfo *_IceSearchReplyWaits ( 452266e564dSmrg IceConn /* iceConn */, 453266e564dSmrg int /* majorOpcode */ 454266e564dSmrg); 455266e564dSmrg 456266e564dSmrgextern void _IceSetReplyReady ( 457266e564dSmrg IceConn /* iceConn */, 458266e564dSmrg IceReplyWaitInfo * /* replyWait */ 459266e564dSmrg); 460266e564dSmrg 461266e564dSmrgextern Bool _IceCheckReplyReady ( 462266e564dSmrg IceConn /* iceConn */, 463266e564dSmrg IceReplyWaitInfo * /* replyWait */ 464266e564dSmrg); 465266e564dSmrg 466266e564dSmrgextern void _IceConnectionOpened ( 467266e564dSmrg IceConn /* iceConn */ 468266e564dSmrg); 469266e564dSmrg 470266e564dSmrgextern void _IceConnectionClosed ( 471266e564dSmrg IceConn /* iceConn */ 472266e564dSmrg); 473266e564dSmrg 474266e564dSmrgextern void _IceGetPoAuthData ( 4759ef0b394Smrg const char * /* protocol_name */, 4769ef0b394Smrg const char * /* address */, 4779ef0b394Smrg const char * /* auth_name */, 478266e564dSmrg unsigned short * /* auth_data_length_ret */, 479266e564dSmrg char ** /* auth_data_ret */ 480266e564dSmrg); 481266e564dSmrg 482266e564dSmrgextern void _IceGetPaAuthData ( 4839ef0b394Smrg const char * /* protocol_name */, 4849ef0b394Smrg const char * /* address */, 4859ef0b394Smrg const char * /* auth_name */, 486266e564dSmrg unsigned short * /* auth_data_length_ret */, 487266e564dSmrg char ** /* auth_data_ret */ 488266e564dSmrg); 489266e564dSmrg 490266e564dSmrgextern void _IceGetPoValidAuthIndices ( 4919ef0b394Smrg const char * /* protocol_name */, 4929ef0b394Smrg const char * /* address */, 493266e564dSmrg int /* num_auth_names */, 4949ef0b394Smrg const char ** /* auth_names */, 495266e564dSmrg int * /* num_indices_ret */, 496266e564dSmrg int * /* indices_ret */ 497266e564dSmrg); 498266e564dSmrg 499266e564dSmrgextern void _IceGetPaValidAuthIndices ( 5009ef0b394Smrg const char * /* protocol_name */, 5019ef0b394Smrg const char * /* address */, 502266e564dSmrg int /* num_auth_names */, 5039ef0b394Smrg const char ** /* auth_names */, 504266e564dSmrg int * /* num_indices_ret */, 505266e564dSmrg int * /* indices_ret */ 506266e564dSmrg); 507266e564dSmrg 508266e564dSmrg#endif /* _ICELIBINT_H_ */ 509