ICElibint.h revision a3129944
1/******************************************************************************
2
3
4Copyright 1993, 1998  The Open Group
5
6Permission to use, copy, modify, distribute, and sell this software and its
7documentation for any purpose is hereby granted without fee, provided that
8the above copyright notice appear in all copies and that both that
9copyright notice and this permission notice appear in supporting
10documentation.
11
12The above copyright notice and this permission notice shall be included in
13all copies or substantial portions of the Software.
14
15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of The Open Group shall not be
23used in advertising or otherwise to promote the sale, use or other dealings
24in this Software without prior written authorization from The Open Group.
25
26Author: Ralph Mor, X Consortium
27******************************************************************************/
28
29#ifndef _ICELIBINT_H_
30#define _ICELIBINT_H_
31
32#include <X11/Xos.h>
33#include <X11/Xfuncs.h>
34#include <X11/Xmd.h>
35#include <X11/ICE/ICEproto.h>
36#include <X11/ICE/ICEconn.h>
37#include <X11/ICE/ICEmsg.h>
38#include <X11/ICE/ICEutil.h>
39#ifdef WIN32
40#include <X11/Xwindows.h>
41#endif
42
43#include <stdlib.h>
44#include <stddef.h>
45
46
47/*
48 * Vendor & Release
49 */
50
51#define IceVendorString  "MIT"
52#define IceReleaseString "1.0"
53
54
55/*
56 * Pad to a 64 bit boundary
57 */
58
59#define PAD64(_bytes) ((8 - ((unsigned int) (_bytes) % 8)) % 8)
60
61#define PADDED_BYTES64(_bytes) ((unsigned int) _bytes + PAD64 (_bytes))
62
63
64/*
65 * Pad to 32 bit boundary
66 */
67
68#define PAD32(_bytes) ((4 - ((unsigned int) (_bytes) % 4)) % 4)
69
70#define PADDED_BYTES32(_bytes) ((unsigned int) _bytes + PAD32 (_bytes))
71
72
73/*
74 * Number of 8 byte units in _bytes.
75 */
76
77#define WORD64COUNT(_bytes) (((unsigned int) ((_bytes) + 7)) >> 3)
78
79
80/*
81 * Number of 4 byte units in _bytes.
82 */
83
84#define WORD32COUNT(_bytes) (((unsigned int) ((_bytes) + 3)) >> 2)
85
86
87/*
88 * Given a string, compute the number of bytes for the STRING representation
89 */
90
91#define STRING_BYTES(_string) \
92    (2 + strlen (_string) + PAD32 (2 + strlen (_string)))
93
94
95/*
96 * Size of ICE input/output buffers
97 */
98
99#define ICE_INBUFSIZE 1024
100
101#define ICE_OUTBUFSIZE 1024
102
103
104/*
105 * Maxium number of ICE authentication methods allowed, and maxiumum
106 * number of authentication data entries allowed to be set in the
107 * IceSetPaAuthData function.
108 *
109 * We should use linked lists, but this is easier and should suffice.
110 */
111
112#define MAX_ICE_AUTH_NAMES 32
113#define ICE_MAX_AUTH_DATA_ENTRIES 100
114
115
116/*
117 * ICE listen object
118 */
119
120struct _IceListenObj {
121    struct _XtransConnInfo 	*trans_conn; /* transport connection object */
122    char			*network_id;
123    IceHostBasedAuthProc 	host_based_auth_proc;
124};
125
126
127/*
128 * Some internal data structures for processing ICE messages.
129 */
130
131typedef void (*_IceProcessCoreMsgProc) (
132    IceConn 		/* iceConn */,
133    int			/* opcode */,
134    unsigned long	/* length */,
135    Bool		/* swap */,
136    IceReplyWaitInfo *  /* replyWait */,
137    Bool *		/* replyReadyRet */,
138    Bool *		/* connectionClosedRet */
139);
140
141typedef struct {
142    int 			major_version;
143    int 			minor_version;
144    _IceProcessCoreMsgProc	process_core_msg_proc;
145} _IceVersion;
146
147
148/*
149 * STORE FOO
150 */
151
152#define STORE_CARD8(_pBuf, _val) \
153{ \
154    *((CARD8 *) _pBuf) = _val; \
155    _pBuf += 1; \
156}
157
158#define STORE_CARD16(_pBuf, _val) \
159{ \
160    *((CARD16 *) _pBuf) = _val; \
161    _pBuf += 2; \
162}
163
164#define STORE_CARD32(_pBuf, _val) \
165{ \
166    *((CARD32 *) _pBuf) = _val; \
167    _pBuf += 4; \
168}
169
170
171#define STORE_STRING(_pBuf, _string) \
172{ \
173    CARD16 _len = (CARD16) strlen (_string); \
174    STORE_CARD16 (_pBuf, _len); \
175    memcpy (_pBuf, _string, _len); \
176    _pBuf += _len; \
177    if (PAD32 (2 + _len)) \
178        _pBuf += PAD32 (2 + _len); \
179}
180
181
182/*
183 * EXTRACT FOO
184 */
185
186#define EXTRACT_CARD8(_pBuf, _val) \
187{ \
188    _val = *((CARD8 *) _pBuf); \
189    _pBuf += 1; \
190}
191
192#define EXTRACT_CARD16(_pBuf, _swap, _val) \
193{ \
194    _val = *((CARD16 *) _pBuf); \
195    _pBuf += 2; \
196    if (_swap) \
197        _val = lswaps (_val); \
198}
199
200#define EXTRACT_CARD32(_pBuf, _swap, _val) \
201{ \
202    _val = *((CARD32 *) _pBuf); \
203    _pBuf += 4; \
204    if (_swap) \
205        _val = lswapl (_val); \
206}
207
208
209#define EXTRACT_STRING(_pBuf, _swap, _string) \
210{ \
211    CARD16 _len; \
212    EXTRACT_CARD16 (_pBuf, _swap, _len); \
213    _string = malloc (_len + 1); \
214    memcpy (_string, _pBuf, _len); \
215    _pBuf += _len; \
216    _string[_len] = '\0'; \
217    if (PAD32 (2 + _len)) \
218        _pBuf += PAD32 (2 + _len); \
219}
220
221#define EXTRACT_LISTOF_STRING(_pBuf, _swap, _count, _strings) \
222{ \
223    int _i; \
224    for (_i = 0; _i < _count; _i++) \
225        EXTRACT_STRING (_pBuf, _swap, _strings[_i]); \
226}
227
228
229#define SKIP_STRING(_pBuf, _swap, _end, _bail) \
230{ \
231    CARD16 _len; \
232    EXTRACT_CARD16 (_pBuf, _swap, _len); \
233    _pBuf += _len + PAD32(2+_len); \
234    if (_pBuf > _end) { \
235	_bail; \
236    } \
237}
238
239#define SKIP_LISTOF_STRING(_pBuf, _swap, _count, _end, _bail) \
240{ \
241    int _i; \
242    for (_i = 0; _i < _count; _i++) \
243        SKIP_STRING (_pBuf, _swap, _end, _bail); \
244}
245
246
247
248/*
249 * Byte swapping
250 */
251
252/* byte swap a long literal */
253#define lswapl(_val) ((((_val) & 0xff) << 24) |\
254		   (((_val) & 0xff00) << 8) |\
255		   (((_val) & 0xff0000) >> 8) |\
256		   (((_val) >> 24) & 0xff))
257
258/* byte swap a short literal */
259#define lswaps(_val) ((((_val) & 0xff) << 8) | (((_val) >> 8) & 0xff))
260
261
262
263/*
264 * ICE replies (not processed via callbacks because we block)
265 */
266
267#define ICE_CONNECTION_REPLY	1
268#define ICE_CONNECTION_ERROR	2
269#define ICE_PROTOCOL_REPLY	3
270#define ICE_PROTOCOL_ERROR	4
271
272typedef struct {
273    int		  type;
274    int 	  version_index;
275    char	  *vendor;
276    char          *release;
277} _IceConnectionReply;
278
279typedef struct {
280    int		  type;
281    char	  *error_message;
282} _IceConnectionError;
283
284typedef struct {
285    int		  type;
286    int 	  major_opcode;
287    int		  version_index;
288    char	  *vendor;
289    char	  *release;
290} _IceProtocolReply;
291
292typedef struct {
293    int		  type;
294    char	  *error_message;
295} _IceProtocolError;
296
297
298typedef union {
299    int			type;
300    _IceConnectionReply	connection_reply;
301    _IceConnectionError	connection_error;
302    _IceProtocolReply	protocol_reply;
303    _IceProtocolError	protocol_error;
304} _IceReply;
305
306
307/*
308 * Watch for ICE connection create/destroy.
309 */
310
311typedef struct _IceWatchedConnection {
312    IceConn				iceConn;
313    IcePointer				watch_data;
314    struct _IceWatchedConnection	*next;
315} _IceWatchedConnection;
316
317typedef struct _IceWatchProc {
318    IceWatchProc		watch_proc;
319    IcePointer			client_data;
320    _IceWatchedConnection	*watched_connections;
321    struct _IceWatchProc	*next;
322} _IceWatchProc;
323
324
325/*
326 * Locking
327 */
328
329#define IceLockConn(_iceConn)
330#define IceUnlockConn(_iceConn)
331
332
333/*
334 * Extern declarations
335 */
336
337extern IceConn			_IceConnectionObjs[];
338extern char			*_IceConnectionStrings[];
339extern int			_IceConnectionCount;
340
341extern _IceProtocol		_IceProtocols[];
342extern int			_IceLastMajorOpcode;
343
344extern int			_IceAuthCount;
345extern const char		*_IceAuthNames[];
346extern IcePoAuthProc		_IcePoAuthProcs[];
347extern IcePaAuthProc		_IcePaAuthProcs[];
348
349extern const int		_IceVersionCount;
350extern const _IceVersion	_IceVersions[];
351
352extern _IceWatchProc		*_IceWatchProcs;
353
354extern IceErrorHandler		_IceErrorHandler;
355extern IceIOErrorHandler	_IceIOErrorHandler;
356
357extern IceAuthDataEntry		_IcePaAuthDataEntries[];
358extern int			_IcePaAuthDataEntryCount;
359
360extern void _IceErrorBadMajor (
361    IceConn		/* iceConn */,
362    int			/* offendingMajor */,
363    int			/* offendingMinor */,
364    int			/* severity */
365);
366
367extern void _IceErrorNoAuthentication (
368    IceConn		/* iceConn */,
369    int			/* offendingMinor */
370);
371
372extern void _IceErrorNoVersion (
373    IceConn		/* iceConn */,
374    int			/* offendingMinor */
375);
376
377extern void _IceErrorSetupFailed (
378    IceConn		/* iceConn */,
379    int			/* offendingMinor */,
380    const char *	/* reason */
381);
382
383extern void _IceErrorAuthenticationRejected (
384    IceConn		/* iceConn */,
385    int			/* offendingMinor */,
386    const char *	/* reason */
387);
388
389extern void _IceErrorAuthenticationFailed (
390    IceConn		/* iceConn */,
391    int			/* offendingMinor */,
392    const char *	/* reason */
393);
394
395extern void _IceErrorProtocolDuplicate (
396    IceConn		/* iceConn */,
397    const char *	/* protocolName */
398);
399
400extern void _IceErrorMajorOpcodeDuplicate (
401    IceConn		/* iceConn */,
402    int			/* majorOpcode */
403);
404
405extern void _IceErrorUnknownProtocol (
406    IceConn		/* iceConn */,
407    const char *	/* protocolName */
408);
409
410extern void _IceAddOpcodeMapping (
411    IceConn		/* iceConn */,
412    int			/* hisOpcode */,
413    int			/* myOpcode */
414);
415
416extern char *_IceGetPeerName (
417    IceConn		/* iceConn */
418);
419
420extern void _IceFreeConnection (
421    IceConn		/* iceConn */
422);
423
424extern void _IceAddReplyWait (
425    IceConn		/* iceConn */,
426    IceReplyWaitInfo *	/* replyWait */
427);
428
429extern IceReplyWaitInfo *_IceSearchReplyWaits (
430    IceConn		/* iceConn */,
431    int			/* majorOpcode */
432);
433
434extern void _IceSetReplyReady (
435    IceConn		/* iceConn */,
436    IceReplyWaitInfo *	/* replyWait */
437);
438
439extern Bool _IceCheckReplyReady (
440    IceConn		/* iceConn */,
441    IceReplyWaitInfo *	/* replyWait */
442);
443
444extern void _IceConnectionOpened (
445    IceConn		/* iceConn */
446);
447
448extern void _IceConnectionClosed (
449    IceConn		/* iceConn */
450);
451
452extern void _IceGetPoAuthData (
453    const char *	/* protocol_name */,
454    const char *	/* address */,
455    const char *	/* auth_name */,
456    unsigned short *	/* auth_data_length_ret */,
457    char **		/* auth_data_ret */
458);
459
460extern void _IceGetPaAuthData (
461    const char *	/* protocol_name */,
462    const char *	/* address */,
463    const char *	/* auth_name */,
464    unsigned short *	/* auth_data_length_ret */,
465    char **		/* auth_data_ret */
466);
467
468extern void _IceGetPoValidAuthIndices (
469    const char *	/* protocol_name */,
470    const char *	/* address */,
471    int			/* num_auth_names */,
472    const char **	/* auth_names */,
473    int	*		/* num_indices_ret */,
474    int	*		/* indices_ret */
475);
476
477extern void _IceGetPaValidAuthIndices (
478    const char *	/* protocol_name */,
479    const char *	/* address */,
480    int			/* num_auth_names */,
481    const char **	/* auth_names */,
482    int	*		/* num_indices_ret */,
483    int	*		/* indices_ret */
484);
485
486#endif /* _ICELIBINT_H_ */
487