ICElibint.h revision a3129944
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
46266e564dSmrg
47266e564dSmrg/*
48266e564dSmrg * Vendor & Release
49266e564dSmrg */
50266e564dSmrg
51266e564dSmrg#define IceVendorString  "MIT"
52266e564dSmrg#define IceReleaseString "1.0"
53266e564dSmrg
54266e564dSmrg
55266e564dSmrg/*
56266e564dSmrg * Pad to a 64 bit boundary
57266e564dSmrg */
58266e564dSmrg
59266e564dSmrg#define PAD64(_bytes) ((8 - ((unsigned int) (_bytes) % 8)) % 8)
60266e564dSmrg
61fb5e8d76Smrg#define PADDED_BYTES64(_bytes) ((unsigned int) _bytes + PAD64 (_bytes))
62266e564dSmrg
63266e564dSmrg
64266e564dSmrg/*
65266e564dSmrg * Pad to 32 bit boundary
66266e564dSmrg */
67266e564dSmrg
68266e564dSmrg#define PAD32(_bytes) ((4 - ((unsigned int) (_bytes) % 4)) % 4)
69266e564dSmrg
70fb5e8d76Smrg#define PADDED_BYTES32(_bytes) ((unsigned int) _bytes + PAD32 (_bytes))
71266e564dSmrg
72266e564dSmrg
73266e564dSmrg/*
74266e564dSmrg * Number of 8 byte units in _bytes.
75266e564dSmrg */
76266e564dSmrg
77266e564dSmrg#define WORD64COUNT(_bytes) (((unsigned int) ((_bytes) + 7)) >> 3)
78266e564dSmrg
79266e564dSmrg
80266e564dSmrg/*
81266e564dSmrg * Number of 4 byte units in _bytes.
82266e564dSmrg */
83266e564dSmrg
84266e564dSmrg#define WORD32COUNT(_bytes) (((unsigned int) ((_bytes) + 3)) >> 2)
85266e564dSmrg
86266e564dSmrg
87266e564dSmrg/*
88266e564dSmrg * Given a string, compute the number of bytes for the STRING representation
89266e564dSmrg */
90266e564dSmrg
91266e564dSmrg#define STRING_BYTES(_string) \
92266e564dSmrg    (2 + strlen (_string) + PAD32 (2 + strlen (_string)))
93266e564dSmrg
94266e564dSmrg
95266e564dSmrg/*
96266e564dSmrg * Size of ICE input/output buffers
97266e564dSmrg */
98266e564dSmrg
99266e564dSmrg#define ICE_INBUFSIZE 1024
100266e564dSmrg
101266e564dSmrg#define ICE_OUTBUFSIZE 1024
102266e564dSmrg
103266e564dSmrg
104266e564dSmrg/*
105266e564dSmrg * Maxium number of ICE authentication methods allowed, and maxiumum
106266e564dSmrg * number of authentication data entries allowed to be set in the
107266e564dSmrg * IceSetPaAuthData function.
108266e564dSmrg *
109266e564dSmrg * We should use linked lists, but this is easier and should suffice.
110266e564dSmrg */
111266e564dSmrg
112266e564dSmrg#define MAX_ICE_AUTH_NAMES 32
113266e564dSmrg#define ICE_MAX_AUTH_DATA_ENTRIES 100
114266e564dSmrg
115266e564dSmrg
116266e564dSmrg/*
117266e564dSmrg * ICE listen object
118266e564dSmrg */
119266e564dSmrg
120266e564dSmrgstruct _IceListenObj {
121266e564dSmrg    struct _XtransConnInfo 	*trans_conn; /* transport connection object */
122266e564dSmrg    char			*network_id;
123266e564dSmrg    IceHostBasedAuthProc 	host_based_auth_proc;
124266e564dSmrg};
125266e564dSmrg
126266e564dSmrg
127266e564dSmrg/*
128266e564dSmrg * Some internal data structures for processing ICE messages.
129266e564dSmrg */
130266e564dSmrg
131266e564dSmrgtypedef void (*_IceProcessCoreMsgProc) (
132266e564dSmrg    IceConn 		/* iceConn */,
133266e564dSmrg    int			/* opcode */,
134266e564dSmrg    unsigned long	/* length */,
135266e564dSmrg    Bool		/* swap */,
136266e564dSmrg    IceReplyWaitInfo *  /* replyWait */,
137266e564dSmrg    Bool *		/* replyReadyRet */,
138266e564dSmrg    Bool *		/* connectionClosedRet */
139266e564dSmrg);
140266e564dSmrg
141266e564dSmrgtypedef struct {
142266e564dSmrg    int 			major_version;
143266e564dSmrg    int 			minor_version;
144266e564dSmrg    _IceProcessCoreMsgProc	process_core_msg_proc;
145266e564dSmrg} _IceVersion;
146266e564dSmrg
147266e564dSmrg
148266e564dSmrg/*
149266e564dSmrg * STORE FOO
150266e564dSmrg */
151266e564dSmrg
152266e564dSmrg#define STORE_CARD8(_pBuf, _val) \
153266e564dSmrg{ \
154266e564dSmrg    *((CARD8 *) _pBuf) = _val; \
155266e564dSmrg    _pBuf += 1; \
156266e564dSmrg}
157266e564dSmrg
158266e564dSmrg#define STORE_CARD16(_pBuf, _val) \
159266e564dSmrg{ \
160266e564dSmrg    *((CARD16 *) _pBuf) = _val; \
161266e564dSmrg    _pBuf += 2; \
162266e564dSmrg}
163266e564dSmrg
164266e564dSmrg#define STORE_CARD32(_pBuf, _val) \
165266e564dSmrg{ \
166266e564dSmrg    *((CARD32 *) _pBuf) = _val; \
167266e564dSmrg    _pBuf += 4; \
168266e564dSmrg}
169266e564dSmrg
170266e564dSmrg
171266e564dSmrg#define STORE_STRING(_pBuf, _string) \
172266e564dSmrg{ \
173fb5e8d76Smrg    CARD16 _len = (CARD16) strlen (_string); \
174266e564dSmrg    STORE_CARD16 (_pBuf, _len); \
175266e564dSmrg    memcpy (_pBuf, _string, _len); \
176266e564dSmrg    _pBuf += _len; \
177266e564dSmrg    if (PAD32 (2 + _len)) \
178266e564dSmrg        _pBuf += PAD32 (2 + _len); \
179266e564dSmrg}
180266e564dSmrg
181266e564dSmrg
182266e564dSmrg/*
183266e564dSmrg * EXTRACT FOO
184266e564dSmrg */
185266e564dSmrg
186266e564dSmrg#define EXTRACT_CARD8(_pBuf, _val) \
187266e564dSmrg{ \
188266e564dSmrg    _val = *((CARD8 *) _pBuf); \
189266e564dSmrg    _pBuf += 1; \
190266e564dSmrg}
191266e564dSmrg
192266e564dSmrg#define EXTRACT_CARD16(_pBuf, _swap, _val) \
193266e564dSmrg{ \
194266e564dSmrg    _val = *((CARD16 *) _pBuf); \
195266e564dSmrg    _pBuf += 2; \
196266e564dSmrg    if (_swap) \
197266e564dSmrg        _val = lswaps (_val); \
198266e564dSmrg}
199266e564dSmrg
200266e564dSmrg#define EXTRACT_CARD32(_pBuf, _swap, _val) \
201266e564dSmrg{ \
202266e564dSmrg    _val = *((CARD32 *) _pBuf); \
203266e564dSmrg    _pBuf += 4; \
204266e564dSmrg    if (_swap) \
205266e564dSmrg        _val = lswapl (_val); \
206266e564dSmrg}
207266e564dSmrg
208266e564dSmrg
209266e564dSmrg#define EXTRACT_STRING(_pBuf, _swap, _string) \
210266e564dSmrg{ \
211266e564dSmrg    CARD16 _len; \
212266e564dSmrg    EXTRACT_CARD16 (_pBuf, _swap, _len); \
213fb5e8d76Smrg    _string = malloc (_len + 1); \
214266e564dSmrg    memcpy (_string, _pBuf, _len); \
215266e564dSmrg    _pBuf += _len; \
216266e564dSmrg    _string[_len] = '\0'; \
217266e564dSmrg    if (PAD32 (2 + _len)) \
218266e564dSmrg        _pBuf += PAD32 (2 + _len); \
219266e564dSmrg}
220266e564dSmrg
221266e564dSmrg#define EXTRACT_LISTOF_STRING(_pBuf, _swap, _count, _strings) \
222266e564dSmrg{ \
223266e564dSmrg    int _i; \
224266e564dSmrg    for (_i = 0; _i < _count; _i++) \
225266e564dSmrg        EXTRACT_STRING (_pBuf, _swap, _strings[_i]); \
226266e564dSmrg}
227266e564dSmrg
228266e564dSmrg
229266e564dSmrg#define SKIP_STRING(_pBuf, _swap, _end, _bail) \
230266e564dSmrg{ \
231266e564dSmrg    CARD16 _len; \
232266e564dSmrg    EXTRACT_CARD16 (_pBuf, _swap, _len); \
233266e564dSmrg    _pBuf += _len + PAD32(2+_len); \
234266e564dSmrg    if (_pBuf > _end) { \
235266e564dSmrg	_bail; \
236266e564dSmrg    } \
2379ef0b394Smrg}
238266e564dSmrg
239266e564dSmrg#define SKIP_LISTOF_STRING(_pBuf, _swap, _count, _end, _bail) \
240266e564dSmrg{ \
241266e564dSmrg    int _i; \
242266e564dSmrg    for (_i = 0; _i < _count; _i++) \
243266e564dSmrg        SKIP_STRING (_pBuf, _swap, _end, _bail); \
244266e564dSmrg}
245266e564dSmrg
246266e564dSmrg
247a3129944Smrg
248266e564dSmrg/*
249266e564dSmrg * Byte swapping
250266e564dSmrg */
251266e564dSmrg
252266e564dSmrg/* byte swap a long literal */
253266e564dSmrg#define lswapl(_val) ((((_val) & 0xff) << 24) |\
254266e564dSmrg		   (((_val) & 0xff00) << 8) |\
255266e564dSmrg		   (((_val) & 0xff0000) >> 8) |\
256266e564dSmrg		   (((_val) >> 24) & 0xff))
257266e564dSmrg
258266e564dSmrg/* byte swap a short literal */
259266e564dSmrg#define lswaps(_val) ((((_val) & 0xff) << 8) | (((_val) >> 8) & 0xff))
260266e564dSmrg
261266e564dSmrg
262a3129944Smrg
263266e564dSmrg/*
264266e564dSmrg * ICE replies (not processed via callbacks because we block)
265266e564dSmrg */
266266e564dSmrg
267266e564dSmrg#define ICE_CONNECTION_REPLY	1
268266e564dSmrg#define ICE_CONNECTION_ERROR	2
269266e564dSmrg#define ICE_PROTOCOL_REPLY	3
270266e564dSmrg#define ICE_PROTOCOL_ERROR	4
271266e564dSmrg
272266e564dSmrgtypedef struct {
273266e564dSmrg    int		  type;
274266e564dSmrg    int 	  version_index;
275266e564dSmrg    char	  *vendor;
276266e564dSmrg    char          *release;
277266e564dSmrg} _IceConnectionReply;
278266e564dSmrg
279266e564dSmrgtypedef struct {
280266e564dSmrg    int		  type;
281266e564dSmrg    char	  *error_message;
282266e564dSmrg} _IceConnectionError;
283266e564dSmrg
284266e564dSmrgtypedef struct {
285266e564dSmrg    int		  type;
286266e564dSmrg    int 	  major_opcode;
287266e564dSmrg    int		  version_index;
288266e564dSmrg    char	  *vendor;
289266e564dSmrg    char	  *release;
290266e564dSmrg} _IceProtocolReply;
291266e564dSmrg
292266e564dSmrgtypedef struct {
293266e564dSmrg    int		  type;
294266e564dSmrg    char	  *error_message;
295266e564dSmrg} _IceProtocolError;
296266e564dSmrg
297266e564dSmrg
298266e564dSmrgtypedef union {
299266e564dSmrg    int			type;
300266e564dSmrg    _IceConnectionReply	connection_reply;
301266e564dSmrg    _IceConnectionError	connection_error;
302266e564dSmrg    _IceProtocolReply	protocol_reply;
303266e564dSmrg    _IceProtocolError	protocol_error;
304266e564dSmrg} _IceReply;
305266e564dSmrg
306266e564dSmrg
307266e564dSmrg/*
308266e564dSmrg * Watch for ICE connection create/destroy.
309266e564dSmrg */
310266e564dSmrg
311266e564dSmrgtypedef struct _IceWatchedConnection {
312266e564dSmrg    IceConn				iceConn;
313266e564dSmrg    IcePointer				watch_data;
314266e564dSmrg    struct _IceWatchedConnection	*next;
315266e564dSmrg} _IceWatchedConnection;
316266e564dSmrg
317266e564dSmrgtypedef struct _IceWatchProc {
318266e564dSmrg    IceWatchProc		watch_proc;
319266e564dSmrg    IcePointer			client_data;
320266e564dSmrg    _IceWatchedConnection	*watched_connections;
321266e564dSmrg    struct _IceWatchProc	*next;
322266e564dSmrg} _IceWatchProc;
323266e564dSmrg
324266e564dSmrg
325266e564dSmrg/*
326266e564dSmrg * Locking
327266e564dSmrg */
328266e564dSmrg
329266e564dSmrg#define IceLockConn(_iceConn)
330266e564dSmrg#define IceUnlockConn(_iceConn)
331266e564dSmrg
332266e564dSmrg
333266e564dSmrg/*
334266e564dSmrg * Extern declarations
335266e564dSmrg */
336266e564dSmrg
337a3129944Smrgextern IceConn			_IceConnectionObjs[];
338a3129944Smrgextern char			*_IceConnectionStrings[];
339a3129944Smrgextern int			_IceConnectionCount;
340266e564dSmrg
341a3129944Smrgextern _IceProtocol		_IceProtocols[];
342a3129944Smrgextern int			_IceLastMajorOpcode;
343266e564dSmrg
344a3129944Smrgextern int			_IceAuthCount;
345a3129944Smrgextern const char		*_IceAuthNames[];
346a3129944Smrgextern IcePoAuthProc		_IcePoAuthProcs[];
347a3129944Smrgextern IcePaAuthProc		_IcePaAuthProcs[];
348266e564dSmrg
349a3129944Smrgextern const int		_IceVersionCount;
350a3129944Smrgextern const _IceVersion	_IceVersions[];
351266e564dSmrg
352a3129944Smrgextern _IceWatchProc		*_IceWatchProcs;
353266e564dSmrg
354a3129944Smrgextern IceErrorHandler		_IceErrorHandler;
355a3129944Smrgextern IceIOErrorHandler	_IceIOErrorHandler;
356266e564dSmrg
357a3129944Smrgextern IceAuthDataEntry		_IcePaAuthDataEntries[];
358a3129944Smrgextern int			_IcePaAuthDataEntryCount;
359266e564dSmrg
360266e564dSmrgextern void _IceErrorBadMajor (
361266e564dSmrg    IceConn		/* iceConn */,
362266e564dSmrg    int			/* offendingMajor */,
363266e564dSmrg    int			/* offendingMinor */,
364266e564dSmrg    int			/* severity */
365266e564dSmrg);
366266e564dSmrg
367266e564dSmrgextern void _IceErrorNoAuthentication (
368266e564dSmrg    IceConn		/* iceConn */,
369266e564dSmrg    int			/* offendingMinor */
370266e564dSmrg);
371266e564dSmrg
372266e564dSmrgextern void _IceErrorNoVersion (
373266e564dSmrg    IceConn		/* iceConn */,
374266e564dSmrg    int			/* offendingMinor */
375266e564dSmrg);
376266e564dSmrg
377266e564dSmrgextern void _IceErrorSetupFailed (
378266e564dSmrg    IceConn		/* iceConn */,
379266e564dSmrg    int			/* offendingMinor */,
3809ef0b394Smrg    const char *	/* reason */
381266e564dSmrg);
382266e564dSmrg
383266e564dSmrgextern void _IceErrorAuthenticationRejected (
384266e564dSmrg    IceConn		/* iceConn */,
385266e564dSmrg    int			/* offendingMinor */,
3869ef0b394Smrg    const char *	/* reason */
387266e564dSmrg);
388266e564dSmrg
389266e564dSmrgextern void _IceErrorAuthenticationFailed (
390266e564dSmrg    IceConn		/* iceConn */,
391266e564dSmrg    int			/* offendingMinor */,
3929ef0b394Smrg    const char *	/* reason */
393266e564dSmrg);
394266e564dSmrg
395266e564dSmrgextern void _IceErrorProtocolDuplicate (
396266e564dSmrg    IceConn		/* iceConn */,
3979ef0b394Smrg    const char *	/* protocolName */
398266e564dSmrg);
399266e564dSmrg
400266e564dSmrgextern void _IceErrorMajorOpcodeDuplicate (
401266e564dSmrg    IceConn		/* iceConn */,
402266e564dSmrg    int			/* majorOpcode */
403266e564dSmrg);
404266e564dSmrg
405266e564dSmrgextern void _IceErrorUnknownProtocol (
406266e564dSmrg    IceConn		/* iceConn */,
4079ef0b394Smrg    const char *	/* protocolName */
408266e564dSmrg);
409266e564dSmrg
410266e564dSmrgextern void _IceAddOpcodeMapping (
411266e564dSmrg    IceConn		/* iceConn */,
412266e564dSmrg    int			/* hisOpcode */,
413266e564dSmrg    int			/* myOpcode */
414266e564dSmrg);
415266e564dSmrg
416266e564dSmrgextern char *_IceGetPeerName (
417266e564dSmrg    IceConn		/* iceConn */
418266e564dSmrg);
419266e564dSmrg
420266e564dSmrgextern void _IceFreeConnection (
421266e564dSmrg    IceConn		/* iceConn */
422266e564dSmrg);
423266e564dSmrg
424266e564dSmrgextern void _IceAddReplyWait (
425266e564dSmrg    IceConn		/* iceConn */,
426266e564dSmrg    IceReplyWaitInfo *	/* replyWait */
427266e564dSmrg);
428266e564dSmrg
429266e564dSmrgextern IceReplyWaitInfo *_IceSearchReplyWaits (
430266e564dSmrg    IceConn		/* iceConn */,
431266e564dSmrg    int			/* majorOpcode */
432266e564dSmrg);
433266e564dSmrg
434266e564dSmrgextern void _IceSetReplyReady (
435266e564dSmrg    IceConn		/* iceConn */,
436266e564dSmrg    IceReplyWaitInfo *	/* replyWait */
437266e564dSmrg);
438266e564dSmrg
439266e564dSmrgextern Bool _IceCheckReplyReady (
440266e564dSmrg    IceConn		/* iceConn */,
441266e564dSmrg    IceReplyWaitInfo *	/* replyWait */
442266e564dSmrg);
443266e564dSmrg
444266e564dSmrgextern void _IceConnectionOpened (
445266e564dSmrg    IceConn		/* iceConn */
446266e564dSmrg);
447266e564dSmrg
448266e564dSmrgextern void _IceConnectionClosed (
449266e564dSmrg    IceConn		/* iceConn */
450266e564dSmrg);
451266e564dSmrg
452266e564dSmrgextern void _IceGetPoAuthData (
4539ef0b394Smrg    const char *	/* protocol_name */,
4549ef0b394Smrg    const char *	/* address */,
4559ef0b394Smrg    const char *	/* auth_name */,
456266e564dSmrg    unsigned short *	/* auth_data_length_ret */,
457266e564dSmrg    char **		/* auth_data_ret */
458266e564dSmrg);
459266e564dSmrg
460266e564dSmrgextern void _IceGetPaAuthData (
4619ef0b394Smrg    const char *	/* protocol_name */,
4629ef0b394Smrg    const char *	/* address */,
4639ef0b394Smrg    const char *	/* auth_name */,
464266e564dSmrg    unsigned short *	/* auth_data_length_ret */,
465266e564dSmrg    char **		/* auth_data_ret */
466266e564dSmrg);
467266e564dSmrg
468266e564dSmrgextern void _IceGetPoValidAuthIndices (
4699ef0b394Smrg    const char *	/* protocol_name */,
4709ef0b394Smrg    const char *	/* address */,
471266e564dSmrg    int			/* num_auth_names */,
4729ef0b394Smrg    const char **	/* auth_names */,
473266e564dSmrg    int	*		/* num_indices_ret */,
474266e564dSmrg    int	*		/* indices_ret */
475266e564dSmrg);
476266e564dSmrg
477266e564dSmrgextern void _IceGetPaValidAuthIndices (
4789ef0b394Smrg    const char *	/* protocol_name */,
4799ef0b394Smrg    const char *	/* address */,
480266e564dSmrg    int			/* num_auth_names */,
4819ef0b394Smrg    const char **	/* auth_names */,
482266e564dSmrg    int	*		/* num_indices_ret */,
483266e564dSmrg    int	*		/* indices_ret */
484266e564dSmrg);
485266e564dSmrg
486266e564dSmrg#endif /* _ICELIBINT_H_ */
487